事件循环内部如何处理异步等待?

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

假设我们有以下异步函数 -

async function foo(x,y) {
  x = x+1
  await fetch('some_url')
  y = y+1
}

当函数foo遇到await时,必须暂停foo的执行,并且必须从调用堆栈中删除其上下文。因为只有这样事件循环才能通过将其他函数推入调用堆栈来执行它们。但是当 fetch 解析并返回时,

y = y+1
仍然需要执行。事件循环如何处理这个问题?

网上查了一下,到处都发现遇到await时,async函数的执行会被挂起,事件循环可以执行其他任务。但这怎么可能呢?因为如果 foo 的上下文从堆栈中弹出(以执行其他任务),事件循环如何知道它必须在获取解析后执行

y = y+1

请提供回答上述问题的任何文件。

javascript async-await v8 event-loop ecma
1个回答
0
投票

这是我的想象。如果这有误导性,请告诉我。

带有

async

await
函数相当于带有回调的函数。

function foo(x,y) {
  function callback() {
    y = y+1
  }
  x = x+1
  fetch('some_url', callback)
}
var x, y
foo(1,2)

闭包堆栈控制哪些变量在作用域内,除了调用堆栈之外还必须考虑这一点。

执行

x = x+1
时,调用堆栈为

的参数 声明
功能 其中
x
y
在范围内
foo
function foo
从主程序调用
var
声明

执行

y = y+1
时,调用堆栈为

的参数 拨打 拨打电话 的参数 声明
功能 其中
x
y
在范围内
callback
function foo
fetch
(母语)
foo
function foo
从主程序调用
var
声明
© www.soinside.com 2019 - 2024. All rights reserved.