【问题标题】:Promise.all is returning an array of undefinedPromise.all 正在返回一个未定义的数组
【发布时间】:2016-04-21 04:04:18
【问题描述】:

函数返回未定义数组时遇到问题。

代码如下:

classMethods.getQueries = function(models, dbId, dateStart, dateEnd) {
  return new Promise(function(resolve, reject) {

    /* Fetch database .... */
    .then(extractQueries, reject)
    .then(sortQueries, reject)
    .then(onlyTen, reject)
    .then(addText, reject)
    .then(function(queries) {
      console.log('getQueries finished', queries) ;  //array of 10 undefined! 
      resolve(queries);
    }, reject);

    /* Functions here .... */

  });
};

在 addText 函数之前一切都很好:

function addText(queries) {
  return Promise.all(queries.map(function(query) {

    models.queries.findById(query.queryId, { raw: true, attributes: ['query'] })
    .then(function(queryFetched) {
      query.text = queryFetched.query;
      console.log(query);
      return Promise.resolve(query);
    }, function(error) {
       return Promise.reject(error);
    });

  }));
};

这给了我一个类似的输出:

getQueries finished [undedfined 10x]

10x  
[query database]
{queryId: ***, text: ********}

我不知道为什么在循环未完成时返回承诺。

感谢您的帮助。

【问题讨论】:

  • 没有理由这样包装你的承诺。

标签: javascript node.js for-loop asynchronous promise


【解决方案1】:

所以这里是我的问题的解决方案:

function addText(queries) {
  return Promise.all(queries.map(function(query) {
    return new Promise(function(resolve, reject) {

      models.queries.findById(query.queryId, { raw: true, attributes: ['query'] })
      .then(function(queryFetched) {
         query.text = queryFetched.query;
         resolve(query);
      }, reject);

    });
  }));
};

【讨论】:

    【解决方案2】:

    这是因为您没有在地图的回调中返回任何承诺:

    function addText(queries) {
      return Promise.all(queries.map(function(query) {
        // add return here or the map returns an array of undefined
        return models.queries
          .findById(query.queryId, {
            raw: true,
            attributes: ['query']
          })
          .then(function(queryFetched) {
            query.text = queryFetched.query;
            console.log(query);
            return Promise.resolve(query);
          }, function(error) {
            return Promise.reject(error);
          });
    
      }));
    };
    

    【讨论】:

    • 啊,是的,我混淆了地图的返回和 then 回调。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-26
    • 2014-08-15
    • 2020-07-07
    • 1970-01-01
    • 2019-02-25
    相关资源
    最近更新 更多