我是在JavaScript中使用承诺的新手,但是我想做的是查询两个不同的表,然后使用前两个查询的结果进行第三个查询。
我的问题是,我似乎无法使我的第三个查询等待两个查询完成。通常,这是一种竞赛条件,当时我希望它两者都使用。
您会建议什么?
这是我尝试的:
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
是您的第一个承诺。我让它运行,不要尝试使其同步。我不使用.then
- 我运行
riderQuery.find()
。我的回报价值是更多承诺。我可以在所有承诺上进行.map
,并开始使用您的.get
来运行这些承诺。我将数组设置为等于ridePromises
。我不控制这些跑步承诺的异步性质,因为那时 - i
.concat
driverPromise
和ridePromises
以形成一个数组并使用Promise.all
使代码立即等待所有内容。
这条代码线:
let allMatchingRides = ridePosts.concat(values);
是让您烦恼的原因。您的 ridePosts
(顺便说一句,非常令人困惑的变量名称(是您的承诺数组,然后您要拿走一系列的承诺,并将数组与values
(您的承诺的返回值(???(相结合。