Promise.all 返回一个未定义的数组

新手上路,请多包涵

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

这是代码:

 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: ********}

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

谢谢您的帮助。

原文由 Guillaume Robbe 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 361
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);
      });

  }));
};

原文由 Shanoor 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

 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);

    });
  }));
};

原文由 Guillaume Robbe 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题