在理解异步等待方面遇到困难

问题描述 投票:0回答:1

我是初学者。看到这段代码的输出后,我对异步编程感到困惑

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 仍在调用堆栈中

javascript node.js async-await promise event-loop
1个回答
0
投票

f3 到底返回了什么(我假设是一个已解决的承诺)

是的,没错。

为什么f1不立即使用它?

Promise 是经过精心设计的,因此,如果您

await
(或调用
.then
),代码的恢复always 会异步发生。这意味着作为开发人员,您可以确信无论 Promise 是否已经解决,或者在解决之前必须经过一段时间,执行顺序都是相同的。如果不是这种情况,可能会导致一些棘手的错误。

更具体地说,通过排队“微任务”完成承诺后恢复。这意味着一旦所有同步代码运行完毕,JavaScript 将立即运行微任务中的代码。在正常代码结束和微任务开始之间没有发生任何事情(例如,没有浏览器绘制,没有 setTimeout 关闭)。

如果您想了解有关微任务和事件循环的更多信息,这篇演讲是关于 javascript 如何安排一切的精彩演讲:https://www.youtube.com/watch?v=cCOL7MC4Pl0

© www.soinside.com 2019 - 2024. All rights reserved.