javascript - .map 异步回调和事件循环

标签 javascript

此代码片段取自google developers :

// map some URLs to json-promises
const jsonPromises = urls.map(async url => {
  const response = await fetch(url);
  return response.json();
});

我明白最后jsonPromises将是一系列 Promise。但是,我不完全确定这是如何发生的。

根据我的理解,当执行到这一行const response = await fetch(url);时它将它从调用堆栈移动到 Web Api,与 return response.json(); 执行相同的操作并移至下一个url来自urls 。这是对的吗 ?我了解简单的事件循环是如何工作的 setTimeout ,但是这个例子让我很困惑。

最佳答案

发生的情况是这样的:

1) .map 函数运行,并为每个元素执行回调(异步函数)。该函数调用 fetch,这会在引擎内部启动一些底层魔法。 fetch 返回一个 Promise。到达await,这会停止函数的执行。由 .map 完成的对函数的调用计算结果为一个 promise 。 .map 收集所有这些 Promise 并将它们存储在一个数组中并返回该数组。

2) 有时,在后台运行的 fetch 之一已建立连接,并回调 JS 并解析 fetch promise 。这会导致异步函数调用继续进行。 res.json() 被调用,这会导致引擎从连接中收集所有数据包,并在后台将其解析为 JSON。它再次返回一个 Promise,它会被等待,从而导致执行再次停止。

3) 有时,其中一个连接结束,整个响应将以 JSON 形式提供。 promise 得到解决,异步函数调用继续执行,返回,这导致 promise (数组中的那个)得到解决。

关于javascript - .map 异步回调和事件循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59220028/

相关文章:

javascript - 如何在 HTML5 Blob 对象上使用 base64 编码

javascript - 为什么这张图片在发送 AJAX 请求之前不显示并在完成时隐藏?

javascript - 简单的令人兴奋的事情; CSS 选择器与 jQuery 选择器

javascript - Highstock 柱形图 - 数据分组导致数据独立于轴滚动

javascript - 根据数据库中的值更改 td 单元格的颜色

javascript - 如何通过参数变量更新对象的属性值

javascript - 如何将表行索引传递给 JavaScript 函数

javascript - 从 Angular watch 中调用函数

javascript - 如何让javascript与flash通信(对象#<HTMLObjectElement>没有方法

javascript - 如何在 element.someEvent 函数中使用更多参数