连锁和同时的承诺

时间:2019-03-01 20:18:03

标签: javascript asynchronous promise

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

  • BB1取决于B1上的结果。
  • B1B2B3都取决于A1的结果。

我想做的是一旦获得A1的结果,我想使用Promises同时启动B1B2B3 。一旦这三个函数返回,那么我想开始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 :(得分:0)

作为异步功能:

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

答案 1 :(得分:-1)

会是这样的:

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

其中A1,B1 ...是应许,而不是功能。