Асинхронное поведение цикла ведет себя по-разному между map и [] .push - PullRequest
0 голосов
/ 20 сентября 2019

Я пробовал различные упражнения вокруг асинхронного ожидания и обнаружил и странное поведение, которое я не могу объяснить между циклом просмотра карты и массива

С картой:

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

С помощью массива push:

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

Теперь оба дают одинаковые результаты, и я не могу понять, почему в случае отправки в массив pr является индексом массива, но с картой это непосредственно результат обещания

они оба являются массивом обещаний, что заставляет их вести себя по-разному в 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);
}

1 Ответ

3 голосов
/ 20 сентября 2019

Разница, которую вы видите, - это разница между for ... of и for ... in.

for ... of перебирает значения в коллекции, подобной массиву.Вы получите реальные Promise объекты.

for ... in перебирает перечисляемые свойства объекта, в данном случае свойства 0, 1, 2 ... объектаМассив.

...