promise.all()返回的结果不捕获范围变量

时间:2016-05-18 15:35:54

标签: javascript asynchronous promise es6-promise

我遇到了从queryArray捕获每个id并将其与return promise结果一起存储的问题。

getSavedQueries: function(req, res) {
    SPromise.then(function(client) {
      const SavedQuery = client.Reports;
      var queryArray = req.query.queryArray; // ['123', '234', '456']
      var payloadObj = {};
      var actions = lo.map(queryArray, function(id) {
        var queryID = Number(id);
        *payloadObj['ID'] = queryID;* <--- not sure where to put this
        return SavedQuery.findOne(queryID).then(function(result){
          payloadObj['query'] = result;
          return payloadObj
        });
      });
      return Promise.all(actions);
    }).then(function(result){
      return res.json(result)
    });
  }

我的res.json(result)返回所有三个对象的数组的最后一项:

[ {ID: 456, query: ...}, 
  {ID: 456, query: ...}, 
  {ID: 456, query: ...}]

而不是:

  [ {ID: 123, query: ...}, 
    {ID: 234, query: ...}, 
    {ID: 456, query: ...}]

1 个答案:

答案 0 :(得分:3)

问题是payloadObj是在地图回调之外定义的。因此,同一个对象在map回调期间发生变异,并从地图回调中创建的promise上调用的then方法返回,因此传递给Promise.all的数组包含3个promise all解析为同一个对象,其ID属性将是数组中的最后一个ID(因为此地图回调最后被调用)并且其query属性将是结果成功的最后一个请求(可能,但不一定是最后一个请求)。