Почему мой процесс выхода выполняется до окончания цикла? - PullRequest
0 голосов
/ 09 января 2019

Я пришел из Ruby, поэтому потратил день, чтобы выяснить, почему process.exit (1) выполняется до завершения цикла. Есть идеи, что мне нужно изменить, чтобы это работало?

export default async () => {
    const workbook = Xlsx.readFile(path.join(__dirname, './excel.xlsx'));
    const data = Xlsx.utils.sheet_to_json(workbook.Sheets.Extract, {
        header: getHeaderFor(workbook.Sheets.Extract),
    });
    await data.map(async (product, index) => {
        if (index < 6) return;
        await processProduct(product);
    });
    process.exit(1);
};

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Хотя ответ @ codtex будет работать, он также приведет к снижению производительности, поскольку каждая итерация цикла будет ждать до предыдущей итерации. Что вы действительно хотите сделать, так это собрать все Обещания и дождаться их окончания:

const promises = data.map((product, index) => {
  if (index < 6) return;
  return processProduct(product);
});

await Promise.all(promises);
0 голосов
/ 09 января 2019

Я думаю, что если вы замените:

await data.map(async (product, index) => {
    if (index < 6) return;
    await processProduct(product);
});

с

for (let i = 6; i < data.length; i++) {
  await processProduct(data[i]);
}

Ваша проблема будет решена.

Некоторое объяснение: Функция карты javascript создает новый массив из исходного массива, когда он вызывает функцию обратного вызова для каждого элемента исходного массива, и помещает возвращенное значение обратного вызова в массив результатов. В этом случае await data.map(... является недопустимым оператором, потому что результатом map является массив. Чтобы исправить это, можно обернуть результат в await Promise.all(data.map(...)) или использовать обычный цикл for. Вы можете использовать первый случай, когда вас не волнует параллелизм, и второй случай, когда вы хотите добиться последовательного порядка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...