javascript - 使用异步函数返回 Promise
问题描述
给定以下两种实现(在 ES6/NodeJS 中)
async TestFunc() {
return new Promise((resolve,reject) => {
...
});
}
和
TestFunc() {
return new Promise((resolve,reject) => {
...
});
}
如果我像这样调用这些函数中的任何一个,行为会有什么不同吗?
await TestFunc();
我假设第一个(异步)实现将返回一个 Promise,我们将等待它返回另一个 Promise,而后一个(同步)实现将返回该 Promise,然后它会被等待。但是,它们都按预期工作,让我有点困惑。
解决方案
异步函数返回一个承诺,该承诺将由return
在函数体中执行的语句返回的值解析(或undefined
在执行最后一行函数代码后返回的 if 解析)。
用一个 Promise 解决一个 Promise 使得该已解决的 Promise 在它被解决时具有解决的 Promise 的已解决状态和值。
所以总是在第一次调用时从异步函数体同步返回一个 Promise P立即将调用 async 函数返回的 Promise 的结果链接到P的结果。对于同步返回的 Promise,这是一个不必要的步骤,并且async
函数的声明不是必需的。
如果TestFunc
是一个异步函数,对于
await TestFunc();
运算符的操作数是调用函数await
生成的promise 。async
这个promise 将由函数体代码中返回的promise 来解决。
如果TestFunc
不是异步函数,则为
await TestFunc();
运算await
符的操作数是由TestFunc
. 有效的区别是TestFunc
不能在内部使用await
运算符而不将其更改回异步函数。
推荐阅读
- java - Java比较值,最好的方法
- multithreading - 多线程实现中的错误
- symfony - Doctrine(Symfony4) 将数据存储为无效的 HEX 值
- javascript - Vuejs动态输入绑定和计算不是一个函数
- python - 在循环中比较相邻列中重复的行值以清理熊猫中的数据
- c# - 在 C# 中插入具有重复记录列的 BigQuery 行
- azure-pipelines - 在 Azure Pipelines 中,如何在其他任务运行时执行后台任务?
- c++ - C++ 测试私有回调方法
- react-native - React Native Metro 捆绑器的运行问题
- sql - 自动生成插入日期