当其中一些得到解决时,解决合并后的承诺

时间:2018-03-21 04:56:25

标签: javascript promise

我有三个承诺。我需要将它们组合在一起以创造更多的承诺。

像这样Promise.all('url1','url2','url3')或者是否有其他可能的方法来实现它。

意图是并行发射所有这些。

我要求当两个中的任何一个被解析时,最终的一个将被解析。

我如何实现它?

3 个答案:

答案 0 :(得分:1)

所以你想要提出一个承诺,例如,3个承诺中的2个解决。 Promise.all不是正确的使用方法,因为,你 等待所有承诺解决。您必须手动执行此操作:



const resolveAfterSeconds = function(sec) {
  return new Promise(res => {
    setTimeout(res, sec * 1000)
  })
}

new Promise((resolve) => {
  const promises = [
    resolveAfterSeconds(1),
    resolveAfterSeconds(2),
    resolveAfterSeconds(3),
  ];
  let resolveCount = 0;
  promises.forEach(prom => {
    prom.then(() => {
      console.log('resolving');
      resolveCount++;
      if (resolveCount === promises.length - 1) resolve();
    });
  });
}).then(() => console.log('done'));




答案 1 :(得分:1)

以下可能会给你一个想法。您有机会运行第一个解决承诺和最后一个承诺。但逻辑是直截了当的,你可以按照自己的意愿进行游戏。我还没有包含错误处理拒绝逻辑,但这应该相当容易。

bring()函数返回一个在100~200ms内解析的promise。



var bring = n => new Promise(v => setTimeout(v,~~(Math.random()*100)+100,`from url_${n}`)),
    pcnt  = 0,
    proms = Array.from({length: 10})
                 .map((_,i) => bring(i).then(v => ++pcnt === 1 ? (console.log(`Do stg with the 1st resolving promise ${v} immediately`), [pcnt,v])
                                                               : pcnt < proms.length ? console.log(`Do nothing with intermediate resolving promise ${v}`)
                                                                                     : (console.log(`Do stg with the last resolving promise ${v} finally\n`), [pcnt,v])
                                            )
                     );

Promise.all(proms)
       .then(vs => console.log("Or when all completes, deal with the values returned from the first and last promise\n",vs.filter(d => !!d)));
&#13;
.as-console-wrapper {
max-height: 100% !important
}
&#13;
&#13;
&#13;

答案 2 :(得分:-1)

你刚才说过...... promise.all([promise1, promise2, promise3])

以下是link to promise.all