我是新手在javascript中使用promises,但我想要做的是查询两个不同的表,然后使用前两个查询的结果进行第三次查询。
我的问题是我似乎无法让我的第三个查询等待两个查询完成。它通常是一种竞争条件,它使用的查询结果实际上我希望它同时使用它们。
你会建议什么?
以下是我的尝试:
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);
});
});
});
答案 0 :(得分:1)
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
。我无法控制这些正在运行的承诺的异步性质,因为那时.concat
driverPromise
和ridePromises
形成一个数组并使用Promise.all
让代码一次等待所有内容。这行代码:
let allMatchingRides = ridePosts.concat(values);
是什么让你搞砸了。顺便说一下,你的ridePosts
(非常令人困惑的变量名称)就是你的承诺数组,然后你就会接受这一系列的承诺并将数组与values
结合起来,你的返回值是承诺(???)。