我有三个承诺。我需要将它们组合在一起以创造更多的承诺。
像这样Promise.all('url1','url2','url3')
或者是否有其他可能的方法来实现它。
意图是并行发射所有这些。
我要求当两个中的任何一个被解析时,最终的一个将被解析。
我如何实现它?
答案 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;
答案 2 :(得分:-1)
你刚才说过...... promise.all([promise1, promise2, promise3])