add optional fail callback to async methods