Как мне регистрировать ответы в правильном порядке, используя асинхронный код

Подумайте об этом так:

Всякий раз, когда вы создаете объект в ECMAscript, этот объект формируется в универсальном месте ECMAscript mystique [], где no человек сможет когда-либо получить. Все, что вы вернетесь, - это ссылка на этот объект в этом мистическом месте.

var obj = { };

Даже obj является только ссылкой на объект (который находится в этом специальном замечательное место), и, следовательно, вы можете передать эту ссылку . Фактически любой фрагмент кода, который обращается к obj , изменит объект , который далеко, далеко.

1
задан Mehrdad Pedramfar 15 January 2019 в 10:03
поделиться

1 ответ

Самый простой способ написать это - использовать цикл for внутри функции async. Обещайте getFile, чтобы он возвращал Promise, а затем ожидайте его на каждой итерации цикла. В конце цикла вызовите обратный вызов:

const getFileProm = file => new Promise((resolve, reject) => {
  getFile(file, (err, fileName) => {
    if (err) reject(err);
    else resolve(fileName);
  });
});

async function fetchContentOfFiles(fileNames, testCB) {
  const fileContent = [];
  try {
    for (let i = 0; i < fileNames.length; i++) {
      fileContent.push(
        await getFileProm(fileNames[i])
      );
    }
  } catch(e) {
    // handle errors, if you want, maybe call testCB with an error and return?
  }
  testCB(null, fileContent);
}

Вероятно, было бы даже лучше, если бы fetchContentOfFiles вызывался и обрабатывался как Обещание , а не с обратными вызовами, а затем ошибки могут быть обработаны потребителем:

async function fetchContentOfFiles(fileNames) {
  const fileContent = [];
  for (let i = 0; i < fileNames.length; i++) {
    fileContent.push(
      await getFileProm(fileNames[i])
    );
  }
  return fileContent;
}

fetchContentOfFiles(arr)
  .then((fileContent) => {
    // do stuff with fileContent
  })
  .catch((err) => {
    // something went wrong
  });
0
ответ дан CertainPerformance 15 January 2019 в 10:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: