首页 > 解决方案 > 链式和同时的 Promise

问题描述

我刚刚遇到了一个 JavaScript 情况,我需要使用 Promises 来处理一些链式查询。我需要进行 5 次数据库查询。我将把每个查询隔离到它们自己的函数中,为简单起见,我们将这些函数称为(A1、B1、B2、B3 和 BB1)。以下是一些细节:

我想做的是,一旦我得到结果A1,我想使用 Promises 来启动B1,B2B3同时。一旦这三个函数返回,那么我想开始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
  });
}

但这也产生了相同的结果。我怎样才能启动三个同时的函数,然后启动一个链式函数,然后最后把所有东西都包起来?我只能找到一个或另一个的结果,但不能将两者结合起来......

标签: javascriptasynchronouspromise

解决方案


作为异步函数:

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 是异步函数,或者返回承诺。


推荐阅读