два Promise.all () на одной странице - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть два 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 продолжал работать до doStuff1(), если вначале обещает, что PromiseGroup1 завершится первым, ноdoStuff2() ждать doStuff1() до конца.Как я могу это реализовать?

Ответы [ 2 ]

2 голосов
/ 26 сентября 2019

Если вы хотите, чтобы один ожидал другого, тогда вы не хотите, чтобы они были отдельными асинхронными Обещаниями.Вместо того чтобы пытаться заставить их быть синхронными, почему бы просто не включить все обещания в один Promise.all, а затем вызывать doStuff1 () и doStuff2 () последовательно в одном и том же обратном вызове .then?

Сохранить впомните, что отдельные Обещания, которые вы передаете Promise. все начнут выполняться, как только они будут созданы;они не будут ждать, чтобы бежать за 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);
});
1 голос
/ 26 сентября 2019

Конечно!

// 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()
})

Это позволяет обеим группам обещаний стартовать одновременно, а также гарантирует, что ваш doStuff2 вызывается только после того, как ваш doStuff1 завершен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...