javascript - 异步 for 循环行为在 map 和 [].push 之间表现不同

标签 javascript for-loop async-await

我尝试了围绕await async的各种练习,发现了我无法解释循环遍历 map 与数组之间的奇怪行为

带 map :

async function loadFiles(files) {
var prs = files.map(getFile);
  for (let pr of prs) {
    console.log(await pr);
  }
}

使用数组推送:

async function loadFiles(files) {
  let prs = [];
  files.forEach(file => {
    prs.push(getFile(file));
  });
  for (let pr in prs) {
    console.log(await prs[pr]);
  }
}

现在两者都给我相同的结果 我不明白为什么在推送到数组的情况下, pr 是数组的索引 但有了 map ,它就直接是 promise 结果

它们都是 Promise 数组,是什么让它们在 for 中表现不同?

其余代码:

function getFile(file) {
  return new Promise(function(resolve) {
    fakeAjax(file, resolve);
  });
}

loadFiles(["file1", "file2", "file3"]);

// **************************************

function fakeAjax(url, cb) {
  var fake_responses = {
    file1: "The first text",
    file2: "The middle text",
    file3: "The last text"
  };
  var randomDelay = (Math.round(Math.random() * 1e4) % 8000) + 1000;

  console.log("Requesting: " + url);

  setTimeout(function() {
    cb(fake_responses[url]);
  }, randomDelay);
}

最佳答案

您看到的差异是 for ... offor ... in 之间的差异。

for ... of 迭代集合(如数组)中的。您将获得实际的 Promise 对象。

for ... in 迭代对象的可枚举属性,在本例中为数组的属性 0、1、2...。

关于javascript - 异步 for 循环行为在 map 和 [].push 之间表现不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58033098/

相关文章:

javascript - 如何在node.js中的异步方法中处理多个数组

swift - SDWebImage 数组 url 未出现在 uiimageview 中

java - 这个Java for 循环终止条件是什么意思?

javascript - Umbraco 表单 DateTimePicker

javascript - 关于导航栏和内容框的完整新手 CSS 问题

javascript - 解释ES6类构造函数和箭头函数的作用

c++ - 是否可以在 C++ 中使用 openmp 进行乘法初始化?

async-await - Jest 测试是否等待先前的异步测试解决?

c# - 快速高效地下载多个文件(异步)

javascript - Array#map() 中的异步/等待