Как частично дождаться вложенных обещаний в JavaScript? - PullRequest
0 голосов
/ 14 июля 2020

Мне нужно сделать 3 основных вызова API (A1, B1 и C1) и 2 дополнительных вызова API (A2 и B2). Это их зависимости:

  • C1 должен ожидать как A1, так и B1
  • A2 должен ожидать A1
  • B2 должен ждать B1

Это работает, но не является правильным подходом, потому что мне не нужно ждать, пока B1 завершит sh, прежде чем я смогу позвонить A2 (или A1 до fini sh, прежде чем я смогу позвонить B2). Примечание: trigger() возвращает обещание.

const a1 = A1.trigger();
const b1 = B1.trigger();

await Promise.all([a1, b1]);
A2.trigger(); // should happen earlier
B2.trigger(); // should happen earlier
C1.trigger();

Думаю, я мог бы сделать это:

async function handleA() {
  const a1 = await A1.trigger();
  A2.trigger();
  return a1;
}
async function handleB() {
  const b1 = await B1.trigger();
  B2.trigger();
  return b1;
}

await Promise.all([handleA(), handleB()]);
C1.trigger();

В этом случае это работает, потому что мне не нужно беспокоиться о A2 , B2 или C1, иначе мне нужно было бы запустить функции вложения, и это могло бы стать волосатым.

Есть ли лучший подход или это лучший способ сделать это?

1 Ответ

3 голосов
/ 14 июля 2020

Синтаксис await состоит в том, чтобы заставить асинхронное программирование вести себя больше как синхронное программирование, что делает это переплетенное выполнение излишне трудным. Это довольно просто, если забыть про await:

const a1 = A1.trigger();
const b1 = B1.trigger();

a1.then(res => A2.trigger(res));
b1.then(res => B2.trigger(res));
Promise.all([a1, b1]).then(res => C1.trigger(res));
...