我是在 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 driverPromiseridePromises形成一个数组并使用 Promise.all让代码一次性等待所有事情。

这行代码:

let allMatchingRides = ridePosts.concat(values); 

是什么让你陷入困境。您的ridePosts (顺便说一下,非常令人困惑的变量名)是您的 promise 数组,然后您将获取该 promise 数组并将该数组与 values 组合起来。 ,你的 promise 的返回值(???)。


评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!