nodejs asyn c для ожидающего выпуска - PullRequest
0 голосов
/ 07 февраля 2020

Попытка l oop через for l oop и сделать что-то, но ждать каждой итерации этого для l oop для завершения, для l oop не будет знать, сколько предметов у него в реальное приложение.

тест

async function getList(){

    return new Promise( (resolve, reject) => {
        let out = [];

        for (let n=0; n <= 4; n++){
            // new Promise( (resolve, reject) => {});
            let time = (n+1) * 250;
            new Promise(resolve => setTimeout(()=>{
                log(n);
                out.push(n);
                resolve();
            }, time));
        }

        // How do I get this resolve to run only once all the for looped promises are complete?
        resolve(out);
    });
}

function test(){
    let numbers = false;
    log("start");
    log(numbers); // logs false (correct);

    getList().then((v)=>{
        log("v = " + v); // this should be an array of ints 0 to 4
        log("completed");
    })
}

console.clear();
test();

выход:

  • start
  • false
  • завершено
  • 0
  • 1
  • 2
  • 3
  • 4

Мне нужно от 0 до 4 чтобы заблокировать процесс и затем завершить журнал.

1 Ответ

1 голос
/ 07 февраля 2020

В первом примере вам не нужно отмечать getList как async (вы не используете await на верхнем уровне). Суть проблемы в том, что setTimeout - это неблокирующая операция, поэтому ваше Обещание разрешается до того, как массив сможет заполниться.

Во втором примере вы используете await, но для неприемлемого элемента (numbers - это просто массив), поэтому применима та же проблема, что и выше (обещание будет разрешено до того, как массив получит заполнено).

Если в вашем приложении "реального мира" у вас есть пример, когда вам нужно ждать определенный период времени, и это должно происходить в последовательном порядке, тогда вы можете создать ожидаемый setTimeout например,

const sleep = timeout => new Promise(resolve => setTimeout(resolve, timeout));

async function getList() {
  const numbers = [1,2,3,4,5,6,7,8,9,10];
  const out = [];
  for (const n in numbers) {
    await sleep(50);
    out.push(n);
  }
  return out;
}
...