nodejs异步等待问题

时间:2020-02-07 08:58:00

标签: node.js promise async-await

尝试遍历for循环并执行某些操作,但是等待该for循环的每次迭代完成,for循环将不知道它在实际应用程序中有多少个项。

测试

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();

输出:

  • 开始
  • false
  • 完整
  • 0
  • 1
  • 2
  • 3
  • 4

我需要0到4来阻止该过程,然后完成记录。

1 个答案:

答案 0 :(得分:1)

在第一个示例中,您无需将getList标记为async(无需在顶层使用await)。问题的症结在于setTimeout是非阻塞操作,因此您的Promise在数组有机会填充之前就已解决。

在第二个示例中,您使用的是await,但是在不可等待的项目上(numbers只是一个数组),因此存在与上述相同的问题(Promise将在数组之前解决)已填充)。

如果在您的“真实世界”应用程序中有一个示例,说明需要等待固定的时间,并且需要按顺序进行,那么可以创建一个等待的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;
}