[英]Can I “promisify” a function by just using async?
因此,我有一个函数应立即返回被拒绝或解决的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错误(例如类型错误)也会导致拒绝,这会使我的整体代码做出反应如果出现意外错误,则更为优雅。
每当声明异步函数时 , AsyncFunction
创建一个AsyncFunction
对象,根据MDN它将返回一个Promise:
一个Promise,它将由async函数返回的值来解决,或者被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"));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.