等待一半的承诺解决

San*_*S B 6 javascript node.js promise

我想并行处理多个异步调用NodeJS。如果特定数量的这些呼叫得到解决或全部完成(一些解决,一些拒绝),我可以继续。如何做到这一点?

Promise.All()当所有承诺都完成时解决,Promise.Any()当任何一个承诺解决或全部被拒绝时解决。有什么办法可以等待 50% 的承诺解决或n解决承诺数量,而不是等待所有承诺解决。

hev*_*ev1 4

您可以编写一个函数,将 then 回调附加到每个给定的Promise,每次增加计数(或将结果推送到数组),并在计数达到特定值时进行解析。

一个基本的例子:

function nResolve(promises, n) {
  if (n < 0) throw Error('Invalid n: ' + n);
  let results = [], rejected = 0;
  return new Promise((resolve, reject) => {
    if (!n) resolve([]);
    else promises.forEach(promise => promise.then(res => {
      results.push(res); // note: order is unpredictable
      if (results.length === n) resolve([...results]);
    }, err => {
      // reject only when there are not enough promises left for n to resolve
      if (++rejected > promises.length - n) reject();
    }));
  });
}
const delay = ms => new Promise(r => setTimeout(() => {
  console.log(ms);
  r(ms);
}, ms));
nResolve([delay(2000), delay(100), delay(500), delay(1000), delay(2000), 
  delay(3000), delay(5000), delay(10000)], 4)
  .then(results => console.log('4 Promises resolved', results));
Run Code Online (Sandbox Code Playgroud)