javascript - 等待同步函数是否同步返回一个值?
问题描述
我从一个我不熟悉的内部实用程序库中导入了一个函数。这个库没有文档,我只是假设它是异步的,因为它的名字getUserDetails
。我以为它在做一个http请求。
我在这样的异步函数中使用它
async function getAllUserInfo(event) {
const details = await getUserDetails(event);
// other stuff
}
我的假设是错误的。一位同事指出这不是异步的。我最终改变了它,但是当我不正确地使用它时,它仍然有效。我能够等待一个同步函数,它返回了正确的数据。
我的问题是关于它是如何工作的。在同步函数上添加等待会使其在下一个滴答时解析,还是像同步函数一样立即返回?
解决方案
它之所以有效,是因为await
它不需要它的操作数是一个承诺!如果它不是一个承诺,它会返回等待的表达式的值。
请参阅await 运算符的文档
重要的部分是:
[rv] = await expression;
expression
: APromise
或任何要等待的值。rv
: 返回 promise 的已实现值,如果不是 a ,则返回值本身Promise
。
在您的情况下getUserDetails
,没有返回承诺,而是一些常规用户详细信息,因此await
表达式只返回了这些详细信息,就好像操作员根本不存在一样。
然而,即使getUserDetails
是同步的,在你的 async 函数前面加上它await
也会放弃对它的调用者的控制,并且稍后await
会拾取它之后的“回调部分”。这是一个示例脚本:
function f() {
console.log('In f');
}
async function g() {
console.log('Starting g');
await f();
console.log('Finishing g');
}
console.log('Starting the script')
g();
console.log('Finishing the script')
注意脚本的输出:
$ node asynctest.js
Starting the script
Starting g
In f
Finishing the script
Finishing g
注意await
调用如何“暂停”g,直到主块完成才能够恢复!所以await
确实有效果。如果您没有将 await 放在那里,那么您会在“完成脚本”之前看到“完成 g”。试试看!
顺便说一句,效果的原因是即使await
可以给出一个不产生承诺的表达式,JS 也会将非承诺操作数转换为立即解析为该值的承诺。所以仍然会创建一个 Promise 并且 await 之后的部分被视为一个回调,直到当前执行流程完成后才能运行。
推荐阅读
- c - 这些特定指针在内存中相邻是否正确?
- flutter - Flutter 头文件替代
- stream - 存储处理后的文本数据以流式传输到 gensim 的最佳方法?
- python - 即使代码中没有这样的命令,Selenium 也会向后导航
- android - Android videoView 在 R.raw 中找不到文件
- python-3.x - 如何在boto3中使用cloudtrail的lookup_events获取开始时间和结束时间之间的所有事件而不指定MaxResults?
- postgresql - 连接到 Azure Postgres 时服务器意外关闭连接
- c - 在矩阵 C 中向下移动值
- swift - 条件绑定的初始化程序必须具有可选类型,而不是“ViewController”和 void 函数中的意外非 void 返回值
- python - 使用 OpenCV 有重叠干扰时如何获得矩形框轮廓