所以我有一个函数应该立即返回一个被拒绝或已经解决的Promise,即它基本上是一个我想要的snychronous函数" promisify"。
在这种情况下我通常做的是这样的事情:
func() {
// some code to check for an error
if (hasError)
return Promise.reject(new Error("Failure"));
}
return Promise.resolve("Success");
}
现在,有了" async" ES2017中的功能似乎我也可以这样做:
async func() {
// some code to check for an error
if (hasError)
throw new Error("Failure");
}
return "Success";
}
所以我基本上只使用async
来宣传"我的函数,在函数体中没有使用await
。正如我所看到的,这种变体应该完全相同。我是对的,还是有任何其他副作用我不知道在这里?
我认为我更喜欢这种模式,因为它有点短,从单独的函数定义可以非常清楚它是异步的,并且任何JavaScript错误(如类型错误)也会导致拒绝,这使我的如果出现意外错误,整体代码会更优雅地做出反应。
答案 0 :(得分:4)
每当您声明一个异步函数时,就会创建一个AsyncFunction
对象,根据MDN将返回一个Promise:
一个Promise,它将使用async函数返回的值进行解析,或者在异步函数中抛出未捕获的异常而被拒绝。
所以是的,使用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"));