我刚遇到一个JavaScript情况,我需要使用Promises处理一些链式查询。我总共需要进行5次数据库查询。我将把每个查询隔离到它们自己的函数中,为简单起见,我们将这些函数称为(A1,B1,B2,B3和BB1)。以下是一些详细信息:
BB1
取决于B1
上的结果。B1
,B2
和B3
都取决于A1
的结果。我想做的是一旦获得A1
的结果,我想使用Promises同时启动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
});
}
但这也产生了相同的结果。如何启动三个同时执行的功能,然后启动链接的功能,然后最后将所有内容打包?我只能在一个或另一个上找到结果,但不能同时找到两者...
答案 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 ...是应许,而不是功能。