当其中一些得到解决时,解决合并后的承诺
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])
以上是关于当其中一些得到解决时,解决合并后的承诺的主要内容,如果未能解决你的问题,请参考以下文章