使用 Promise.all 时承诺之间的延迟

tim*_*lim 9 promise ecmascript-6

有没有办法使用 Promise.all() 延迟对一系列承诺的评估?

在将它们添加到数组之前手动将延迟函数添加到每个承诺的末尾是否有意义?

Promise.all([p1,p2,p3]).then(res => console.log(res))
Run Code Online (Sandbox Code Playgroud)

我想添加一个延迟,因为我的服务器无法一次处理太多请求。

Est*_*ask 13

Promise.all旨在解决承诺何时完成,但无论Promise.all.

为此,最初应创建 promise 以产生延迟:

const delayIncrement = 500;
let delay = 0;

const p1 = new Promise(resolve => setTimeout(resolve, delay)).then(() => fetch(...));

delay += delayIncrement;

const p2 = new Promise(resolve => setTimeout(resolve, delay)).then(() => fetch(...));

delay += delayIncrement;

...
Promise.all([p1,p2,p3]).then(...);
Run Code Online (Sandbox Code Playgroud)

相同的解决方案可用于在循环内批量创建请求承诺。

延迟承诺的秘诀可以在这个答案中找到。


GoF*_*rth 7

是的,您可以使用 Promise.all 来延迟 Promise 来创建交错执行,而且这很容易做到:

// Promise.all() with delays for each promise
let tasks = [];
for (let i = 0; i < 10; i++) {
  const delay = 500 * i;
  tasks.push(new Promise(async function(resolve) {
    // the timer/delay
    await new Promise(res => setTimeout(res, delay));

    // the promise you want delayed
    // (for example):
    // let result = await axios.get(...);
    let result = await new Promise(r => {
      console.log("I'm the delayed promise...maybe an API call!");
      r(delay); //result is delay ms for demo purposes
    });

    //resolve outer/original promise with result
    resolve(result);
  }));
}

let results = Promise.all(tasks).then(results => {
  console.log('results: ' + results);
});
Run Code Online (Sandbox Code Playgroud)

你也可以在这里运行它。

与其他答案中所示的可以使用 .then() 完成的链之间的延迟不同,这是每个 Promise 都不同的延迟,因此当您调用 Promise.all() 时,它们将交错排列。例如,当您调用具有速率限制的 API 时,如果并行触发所有调用就会违反该速率限制,则此功能非常有用。

和平


tim*_*c22 6

我需要动态创建调用,因此根据 @estus-flask 的答案,设法想出:

  let delay = 0; const delayIncrement = 1000;

  const promises = items.map(item => {
    delay += delayIncrement;
    return new Promise(resolve => setTimeout(resolve, delay)).then(() =>
        fetch(...);
  })

  let results = await Promise.all(promises);
Run Code Online (Sandbox Code Playgroud)


Ber*_*rgi 0

有没有办法使用 来延迟对一系列承诺的评估 Promise.all()

不。承诺不会被“评估”,它们只是解决。何时发生这种情况是由它们的创造者决定的,而不是其他的。当Promise.all被调用时,promisep1和已经被创建(并且它们的异步任务可能已经开始)p2p3