JavaScript并承诺执行两个异步任务



我是在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 driverPromiseridePromises以形成一个数组并使用Promise.all使代码立即等待所有内容。

这条代码线:

let allMatchingRides = ridePosts.concat(values);

是让您烦恼的原因。您的 ridePosts(顺便说一句,非常令人困惑的变量名称(是您的承诺数组,然后您要拿走一系列的承诺,并将数组与values(您的承诺的返回值(???(相结合。

最新更新