繁体   English   中英

我可以仅通过使用异步来“实现”功能吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM