【问题标题】:returned results from promise.all() does not capture scoped variable从 promise.all() 返回的结果不捕获范围变量
【发布时间】:2016-05-18 23:55:52
【问题描述】:

我在从 queryArray 中捕获每个 id 并将其与返回承诺结果一起存储时遇到问题。

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: ...}]

【问题讨论】:

  • 你继续使用相同的payloadObj

标签: javascript asynchronous promise es6-promise


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2019-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多