所以我有一个函数,它应该立即返回一个被拒绝或解决的Promise,也就是说,它基本上是一个我想“中止”的同步函数。
在这种情况下,我通常会这样做:
func() {
// some code to check for an error
if (hasError)
return Promise.reject(new Error("Failure"));
}
return Promise.resolve("Success");
}
现在,有了ES2017中的“异步”功能,我似乎也可以做到这一点:
async func() {
// some code to check for an error
if (hasError)
throw new Error("Failure");
}
return "Success";
}
因此,我基本上只是为了“简化”我的函数而使用async
,而不是在函数体中使用await
。在我看来,这个变体应该做完全相同的事情。我说的对吗?还有其他我不知道的副作用吗?
我想我更喜欢这个模式,因为它有点短,单从函数定义就很清楚它是异步的,任何JavaScript错误(如类型错误)也会导致拒绝,这会使我的整个代码在出现意外错误的情况下做出更优雅的反应。
发布于 2018-06-03 03:03:53
每当你声明一个异步函数时,就会创建一个AsyncFunction
对象,根据MDN,它将返回一个Promise:
将使用异步函数返回的值进行解析的承诺,或使用异步函数中抛出的未捕获异常而拒绝的承诺。
所以,是的,它使用async
会简化一个函数。
另外,让我们做一些测试;
async function fn(val) {
console.log(val);
if (val) {
return "true";
}
throw new Error("false");
}
console.log(Object.getPrototypeOf(fn).constructor)
console.log(fn(true) instanceof Promise);
console.log(Object.getPrototypeOf(fn(true)).constructor)
console.log(fn(false) instanceof Promise);
console.log(Object.getPrototypeOf(fn(false)).constructor)
fn(true).then(val => console.log(val));
fn(false).catch(err => console.log("ERROR"));
https://stackoverflow.com/questions/50660103
复制相似问题