我是在 JavaScript 中使用 Promise 的新手,但我想做的是查询两个不同的表,然后使用前两个查询的结果执行第三个查询。
我的问题是我似乎无法让我的第三个查询等待两个查询完成。它通常是一个竞争条件,它使用哪个查询结果,而实际上我希望它同时使用两者。
你有什么建议?
这是我正在尝试的:
Parse.Cloud.define("getLogs", (req, res) => {
let q = new Parse.Query("logTable");
let riderQuery = new Parse.Query("riders");
let driverQuery = new Parse.Query("drivers");
var ridePosts = [];
driverQuery.equalTo("driver", req.user);
riderQuery.equalTo("rider", req.user);
riderQuery.include("ridePost");
var promise = driverQuery.find().then(results => {
ridePosts = results;
});
ridePosts.push(promise);
riderQuery.find().then(results => {
for (var i = 0; i < results.length; i++) {
var promise = results[i].get("ridePost");
ridePosts.push(promise);
}
});
Promise.all(ridePosts).then(values => {
let allMatchingRides = ridePosts.concat(values);
q.containedIn("participants", [req.user]);
q.containedIn("rideRequest", allMatchingRides);
q.find().then(logs => {
res.success(logs);
});
});
});
请您参考如下方法:
var driverPromise = driverQuery.find()
riderQuery.find().then(results => {
var ridePromises = results.map(result => result.get('ridePost'))
var promiseArray = ridePromises.concat([driverPromise])
return Promise.all(promiseArray).then(values => {
q.containedIn('participants', [req.user]);
q.containedIn('rideRequest', values);
})
})
.then(() => {q.find()})
.then(logs => res.success(logs))
我很确定您正在寻找这样的东西。让我一步一步解释。
-
driverPromise
是你的第一个 promise 。我让它运行并且不尝试使其同步。我不使用.then
- 我跑
riderQuery.find()
。我的返回值是一系列更多的 promise 。我可以.map
超越所有的 promise ,并开始用你的.get
来履行每一个 promise 。 。我将数组设置为等于ridePromises
。我不控制这些正在运行的 Promise 的异步性质,因为这样 - 我
.concat
driverPromise
和ridePromises
形成一个数组并使用Promise.all
让代码一次性等待所有事情。
这行代码:
let allMatchingRides = ridePosts.concat(values);
是什么让你陷入困境。您的ridePosts
(顺便说一下,非常令人困惑的变量名)是您的 promise 数组,然后您将获取该 promise 数组并将该数组与 values
组合起来。 ,你的 promise 的返回值(???)。