簡體   English   中英

如何等待一個承諾完成的循環來執行一個方法?

[英]How to wait for a loop with promises to complete to execute a method?

我想執行一個帶有承諾的循環,但我只想在循環完成后才執行一個方法。

這是我想做的一個類似的例子

const array = ['a', 'b', 'c'];

console.log('start');
array.forEach((i) => {
  setTimeout(()=> console.log(i), 3000);        
});
console.log('end');

這是我得到的結果。

start
end
a
b
c

一旦你知道怎么做,就可以很容易地使用Promise.all之類的東西。

關鍵是創建一個 Promises 數組,然后在其上調用Promise.all

但在我展示之前,我們需要做一些調整:

首先讓我們包裝setTimeout以返回 promise:

function delay(amount) {
    return new Promise((resolve) => {
        setTimeout(resolve, amount);
    });
}

然后更改代碼以將所有創建的承諾推送到一個數組中:

const array = ['a', 'b', 'c'];
let promises = [];

async function doSomething(i) {
    console.log(i);

    await delay(3000);
}

console.log('start');
array.forEach((i) => {
    const promise = doSomething(i);

    promises.push(promise);
});

這里的doSomething正在做異步工作。

最后,我們等待Promise.all解決所有 Promise:

await Promise.all(promises);

console.log('end');

給出:

start
a
b
c
end

 function delay(amount) { return new Promise((resolve) => { setTimeout(resolve, amount); }); } const array = ['a', 'b', 'c']; let promises = []; async function doSomething(i) { console.log(i); await delay(3000); } console.log('start'); array.forEach((i) => { const promise = doSomething(i); promises.push(promise); }); Promise.all(promises).then(() => { console.log('end'); });

一種選擇是執行以下操作:

const array = ['a', 'b', 'c'];

console.log('start');
const promises = [];
array.forEach((i) => {
    promises.push(new Promise(resolve => setTimeout(() => {
        console.log(i)
        resolve()
    }, 3000)))
})

Promise.all(promises).then(() => {
    console.log('end');
})

setTimeout是異步的,但不像promise那樣可用。如果您的直接問題是在所有超時結束時執行您的代碼,那么應該按如下方式完成:

const array = ['a', 'b', 'c'];
let numberOfTimeoutsToBeExecuted = array.length;
// keep track of the number of timeouts that have finished execution
let numberOfTimeoutsExecuted = 0;

console.log('start');
array.forEach((i) => {
  setTimeout(() => {
    console.log(i),
    numberOfTimeoutsExecuted += 1;
    // execute your code when the last timeout has finished execution
    if (numberOfTimeoutsToBeExecuted === numberOfTimeoutsExecuted) {
      console.log('end');
    }
  }, 3000);       
});

但是,如果你想等待多個promise完成執行,下面是最好的方法:

const array = ['a', 'b', 'c'];
const promises = [];

console.log('start');
array.forEach((i) => {
    // add all promises that will be executed into array
    promises.push(new Promise((resolve, reject) => {
      setTimeout(()=> {
        console.log(i);
        resolve();
      }, 3000);
    }));
});

// execute all promises here
Promise.all(promises).then(() => console.log('end'));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM