两个 Promise.all() 在同一页面上



我在同一页面上有两个 Promise.all((,如下所示:

// promiseGroup1
Promise.all([promise1, promise2, promise3]).then(function(values1) {
doStuff1(values1)
})
// promiseGroup2
Promise.all([promise4, promise5, promise6]).then(function(values2) {
doStuff2(values2)
})

我希望一切都尽快开始,如果 promiseGroup1 首先完成,则让 promiseGroup1 继续doStuff1(),但doStuff2()等待doStuff1()完成。我该如何实现?

如果您希望一个等待另一个,那么您不希望它们是单独的异步承诺。与其试图强制它们同步,为什么不将所有承诺包含在一个 Promise.all 中,然后在同一个回调中依次调用 doStuff1(( 和 doStuff2(.then

请记住,您传递给 Promise.all 的单个承诺将在创建后立即开始运行;他们不会等待运行 Promise.all。因此,这不像将它们放在首先解决的不同组中。

澄清一下,您所要求的等同于以下内容:

Promise.all([promise1, promise2, promise3, promise4, promise5, promise6]).then(function(values1) {
doStuff1(values1);
doStuff2(values1.slice(3));
});

除非 doStuff1 有您希望在第二组承诺解决之前发生的副作用,否则如果第一组承诺首先解决?这会很奇怪,可能值得重构,但为此,只需从第一个的处理程序返回第二个承诺并将它们链接起来:

Promise.all([promise1, promise2, promise3]).then(function(values) {
doStuff1(values1);
return Promise.all([promise4, promise5, promise6]);
})
.then(function(values) {
doStuff2(values);
});

当然!

// promiseGroup1
const stuff1Promise = new Promise(resolveStuff1 => {
Promise.all([promise1, promise2, promise3]).then(function(values) {
const stuff1 = doStuff1();
resolveStuff1(stuff1);
})
});
// promiseGroup2
Promise.all([promise4, promise5, promise6, stuff1Promise]).then(function(values) {
doStuff2()
})

这可以让您的两个 promise 组同时启动,并确保仅在doStuff1完成后调用您的doStuff2

最新更新