Цепные и одновременные обещания - PullRequest
0 голосов
/ 01 марта 2019

Я только что столкнулся с ситуацией JavaScript, где мне нужно использовать Promises для обработки некоторых связанных запросов.Мне нужно сделать 5 запросов к базе данных.Я собираюсь выделить каждый запрос в свою собственную функцию, для простоты давайте назовем эти функции (A1, B1, B2, B3 и BB1).Вот некоторые подробности:

  • BB1 зависит от результатов B1.
  • B1, B2 и B3 зависят отрезультаты A1.

Я хотел бы сделать, как только у меня появятся результаты A1, я хотел бы использовать Обещания, чтобы начать B1, B2 иB3 одновременно.Как только эти три функции вернутся, я хотел бы запустить BB1.

Я попытался сделать что-то вроде:

A1() {
  // Recieved results from A1 Query
  console.log("CHECK 1");
  Promise.all([
    B1(), B2(), B3(),
  ]).then(() => {
     console.log("CHECK 4");
    // Wrap everything up
  });
}

B1() {
  // Recieved results from B1 Query
  console.log("CHECK 2");
  Promise.all(
    BB1(),
  ).then(() => {
    return;
  });
}

BB1() {
  // Recieved results from BB1 Query
  console.log("CHECK 3");
  return;
}

Но моя консоль ведет журнал: "Проверка 1", "Проверка2 "," Проверка 4 "," Проверка 3 ".

Я также пытался:

A1() {
  // Recieved results from A1 Query
  console.log("CHECK 1");
  Promise.all([
    B1(), B2(), B3(),
  ]).then(() => {
     BB1();
  }).finally(() => {
     // Wrap everything up
  });
}

Но это также дало те же результаты.Как я могу запустить три одновременные функции, затем запустить цепочку функций и, наконец, завершить все?Мне удалось найти результаты только для одного или другого, но не для комбинации обоих ...

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

В качестве асинхронной функции:

async combinedQuery(){
  let a1 = await A1()
  console.log("first query done")
  let [b1, b2, b3] = await Promise.all([B1(), B2(), B3()])
  console.log("second query batch done")
  let bb1 = await BB1()
  console.log("all queries done:" a1, b1, b2, b3, bb1)
}

Предполагая, что A1, B1, B2, B3 и BB1 являются асинхронными функциями или возвращают обещания.

0 голосов
/ 01 марта 2019

Это будет примерно так:

A1.then((a1) => {
  Promise.all([B1, B2, B3]).then(([b1, b2, b3]) => {
    BB1.then((bb1) => {
      console.log(a1, b1, b2, b3, bb1);
    })
  })
})

Где A1, B1 ... обещания, а не функции.

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