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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当其中一些得到解决时,解决合并后的承诺相关的知识,希望对你有一定的参考价值。

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

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

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

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

我怎么能实现它?

答案

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

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
`), [pcnt,v])
                                            )
                     );

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

因此,您希望得出一个可以解决的承诺,例如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'));
另一答案

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

这是link to promise.all

以上是关于当其中一些得到解决时,解决合并后的承诺的主要内容,如果未能解决你的问题,请参考以下文章

13 个非常有用的 Python 代码片段

滑动到下一个片段并返回后的片段不显示任何内容

是否有一个函数返回一个承诺,当在 React Native 中应用了对组件的任何未决更改时,该承诺得到解决?

承诺等待得到解决而不返回

返回已经解决的承诺

失败的 Xcode Git 合并卡住了