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

时间:2018-02-07 00:16:45

标签: javascript parsing asynchronous promise

我是新手在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);
    });
  });
});

1 个答案:

答案 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 driverPromiseridePromises形成一个数组并使用Promise.all让代码一次等待所有内容。

这行代码:

let allMatchingRides = ridePosts.concat(values);

是什么让你搞砸了。顺便说一下,你的ridePosts(非常令人困惑的变量名称)就是你的承诺数组,然后你就会接受这一系列的承诺并将数组与values结合起来,你的返回值是承诺(???)。