我从一个我不熟悉的内部实用程序库中导入了一个函数。该库没有文档,由于其名称,我只是假定它是异步的getUserDetails
。我以为它正在执行http请求。
我在这样的异步函数中使用了它
async function getAllUserInfo(event) {
const details = await getUserDetails(event);
// other stuff
}
我的假设是错误的。一位同事指出这不是异步的。我最终更改了它,但是当我使用不正确时,它仍然可以工作。我能够等待一个同步函数,它返回了正确的数据。
我的问题是关于它是如何工作的。在同步函数上加前缀和等待会使其在下一个滴答滴答中解决,还是像同步函数一样立即返回?
之所以起作用,是因为await
不需要其操作数是一个承诺!如果不是promise,则返回等待的表达式的值。
请参阅等待操作员的文档
重要的部分是:
[rv] = await expression;
expression
A Promise or any value to wait for.
rv
Returns the fulfilled value of the promise, or the value itself if it's not a Promise.
在您的情况下getUserDetails
,没有返回承诺,而是返回了一些常规用户详细信息,因此该await
表达式仅返回了这些详细信息,就像操作员根本不在那儿一样。
但是,即使getUserDetails
是同步的,await
在async函数中将其放在前面也会将控制权交给它的调用方,而之后的“ callback部分”将在以后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
调用“ paused” g是如何完成的,直到主块完成后才能恢复!所以await
确实有效果。如果您没有在这里等待,那么您将在“完成脚本”之前看到“ Finishing g”。试试看!
顺便说一句,造成这种情况的原因是,即使await
可以给它提供一个不会产生承诺的表达式,JS也会将非承诺操作数转换为立即解析为该值的承诺。因此,仍然会创建一个Promise,将等待后的部分视为回调,直到当前执行流程完成后才能运行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句