Код после цикла for не выполняется при использовании await new Promise () - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть асинхронная функция, и с ней у меня есть цикл:

let z;
let step = 100;
for(z=0; z < (combinedData.length-1)/step; z += 1){
    // FURTHER CODE
}

Внутри цикла есть код:

let z;
let step = 100;
for(z=0; z < (combinedData.length-1)/step; z += 1){
    await new Promise((rs,rj)=>{
        setTimeout(()=>{
            for(let x = 0; x < step; x++){
                let a = combinedData; // Array of 2522 elements
                let i = z*step + x;
                if(!(i < a.length))
                    return;
                // LONG CODE TO EXECUTE NOT PASTING BECAUSE IRRELEVANT I THINK
            }
            rs();
        });
    });
    console.log(`Showed ${z}`);
}
console.log('end');

И когда я запускаю его, результат:

Showed 1
Showed 2
...
Showed 24

Все правильно, за исключением того, что не отображается «конец».Я проверил, и в разделе

//LONG CODE TO EXECUTE NOT PASTING BECAUSE IRRELEVANT

нет ошибок, так что не беспокойтесь об этом.

Я думаю, эта ошибка лежит где-то в

if(!(i<a.length))return;

, но я нене знаю где и почему.Это утверждение очень важно, чтобы не получить TypeError из-за доступа к a[i]

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Код после вашего цикла не выполняется, потому что вы не разрешаете или не отклоняете созданный Promise.

Вы правы в том, что это if(!(i<a.length))return; вызывает проблему,потому что с помощью оператора return вы отменяете дальнейшее выполнение функции внутри setTimeout, но не выполняете свое обещание.Так что функции ожидания ждут вечно.

Чтобы просто решить вашу проблему, вы можете сделать следующее:

if(!(i<a.length)){
    return rs(); // Returns and resolves your created promise
}
0 голосов
/ 01 февраля 2019

Это может дать вам представление о том, как правильно кодировать ваш цикл:

async function delayedFunc(i, index) {
  await new Promise(resolve => setTimeout(resolve, 100));
  console.log(i, index);
}

async function main(array) {
  for (const [index, item] of array.entries()) {
    await delayedFunc(item, index);
  }
  console.log('Done!');
}

main([1, 2, 3, 4, 5]);
...