Javascript 我可以吗;“承诺”;只使用异步的函数?

Javascript 我可以吗;“承诺”;只使用异步的函数?,javascript,asynchronous,promise,ecmascript-2017,Javascript,Asynchronous,Promise,Ecmascript 2017,所以我有一个函数,它应该立即返回一个被拒绝或已解决的承诺,也就是说,它基本上是一个我想“承诺”的同步函数 在这种情况下,我通常会这样做: func() { // some code to check for an error if (hasError) return Promise.reject(new Error("Failure")); } return Promise.resolve("Success"); } 现在,随着ES201

所以我有一个函数,它应该立即返回一个被拒绝或已解决的承诺,也就是说,它基本上是一个我想“承诺”的同步函数

在这种情况下,我通常会这样做:

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
只是为了“提示”我的函数,而不在函数体的任何地方使用
wait
。在我看来,这个变体应该做完全相同的事情。我是对的,还是我在这里没有意识到其他副作用

我想我更喜欢这种模式,因为它有点短,仅从函数定义就可以很清楚地看出它是异步的,并且有任何JavaScript错误(比如类型错误)还会导致拒绝,这会使我的整个代码在出现意外错误时做出更优雅的反应。

无论何时声明异步函数,都会创建一个
异步函数
对象,根据MDN,该对象将返回一个承诺:

将使用异步函数返回的值解析的承诺,或使用异步函数内引发的未捕获异常拒绝的承诺

因此,使用
async
将实现一个函数

另外,让我们做一些测试

异步函数fn(val){ 控制台日志(val); if(val){ 返回“真”; } 抛出新错误(“错误”); } log(Object.getPrototypeOf(fn.constructor) console.log(fn(true)Promise实例); console.log(Object.getPrototypeOf(fn(true)).constructor) console.log(fn(false)Promise实例); console.log(Object.getPrototypeOf(fn(false)).constructor) fn(true).then(val=>console.log(val));
fn(false).catch(err=>console.log(“ERROR”)“在我看来,这个变体应该是完全相同的。”正确的“我是对的,还是这里有我不知道的其他副作用?”不,这里没有什么意外的。相关:!伯吉:为什么?虽然函数本质上是同步的,但我希望它的行为是异步的。原因是我有一个统一各种存储操作的API。我的一些适配器是异步的(XHR),有些不是(localStorage)。但我希望有一个统一的API,这样我就可以始终执行myStorage.read()之类的操作。然后(…),无论我使用的适配器是否是异步的。还是不是你会接受的用例?。。。因此,API本质上是异步的。现在,对于主类来说,以相同的方式处理来自任何适配器的结果要容易得多,即期望有一个承诺。我还可以通过使用Promise.race一次读取多个源,支持缓存(即使有多个适配器)等。所以我敢说:永远不要说“永远”是啊,看起来不错!谢谢你的测试。我想从现在开始我会使用这个模式,我喜欢它;)