javascript - 链式和同时的 Promise
问题描述
我刚刚遇到了一个 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
});
}
但这也产生了相同的结果。我怎样才能启动三个同时的函数,然后启动一个链式函数,然后最后把所有东西都包起来?我只能找到一个或另一个的结果,但不能将两者结合起来......
解决方案
作为异步函数:
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 是异步函数,或者返回承诺。
推荐阅读
- docker - 为什么 docker 将旧代码推送到远程服务器
- vb.net - 制表文本文件
- python - 你首选的推特 api 是什么 - 我使用 tweepy 但只能获得 100 条推文
- laravel - Laravel + SPA VueJs 没有为未知组件提供错误
- reactjs - Babel 在 NX 库中使用类验证器失败
- android - 发送从 pm5 设备中提取数据的命令后如何从 USB 请求中获取结果?
- c# - 为obj创建mtl文件?
- windows - 您必须安装 Windows 10 SDK 版本 10.0.19041.0,包括“Windows 调试工具”功能。(Chromium)
- laravel - 未定义的变量laravel 7
- python - 从 matplotlib 子图创建值