我是初学者。看到这段代码的输出后,我对异步编程感到困惑
async function f1() {
console.log('this is f1');
let res = await f3();
console.log('result of f1 from f3 = ', res['status']);
console.log('end of f1');
}
async function f3() {
console.log('this is f3')
console.log('returning res from f3');
return {"status": 600} ;
}
f1();
console.log('inside global context');
现在我的疑问是,即使 f3() 中没有进行异步工作,因为一切都是控制台日志和简单的返回,为什么 f3 返回的输出不立即打印在 f1() 中,而是首先打印
inside global context
被打印,然后 f1() 的控制台日志被打印。 f3 到底返回了什么(我假设是一个已解决的承诺)以及为什么 f1 不立即使用它?
如果我没记错的话,当 f3 返回 json 时,f1 仍在调用堆栈中
f3 到底返回了什么(我假设是一个已解决的承诺)
是的,没错。
为什么f1不立即使用它?
Promise 是经过精心设计的,因此,如果您
await
(或调用 .then
),代码的恢复always 会异步发生。这意味着作为开发人员,您可以确信无论 Promise 是否已经解决,或者在解决之前必须经过一段时间,执行顺序都是相同的。如果不是这种情况,可能会导致一些棘手的错误。
更具体地说,通过排队“微任务”完成承诺后恢复。这意味着一旦所有同步代码运行完毕,JavaScript 将立即运行微任务中的代码。在正常代码结束和微任务开始之间没有发生任何事情(例如,没有浏览器绘制,没有 setTimeout 关闭)。
如果您想了解有关微任务和事件循环的更多信息,这篇演讲是关于 javascript 如何安排一切的精彩演讲:https://www.youtube.com/watch?v=cCOL7MC4Pl0