【问题标题】:Promise Chain not waiting for promises to resolve before endingPromise Chain 在结束前不等待 Promise 解决
【发布时间】:2016-12-16 05:05:22
【问题描述】:

我试着把这些简化一下:

      passData.savedDBGames.forEach((gameInfo) => {
        return new Promise((resolve, reject) => {
          stats.getPlayersStats(gameInfo.fixtureID).then((playerStats) => {
             playerStatsPromise.push(playerStats);
             console.info('Grab Done');
             resolve();
           });
        });
      });

      Promise.all(playerStatsPromise)
        .then(function () {
          console.info('All Done');
          app.io.emit('admin', 'Admin: done');
          resolve(passData);
        });

据我所知Promise.all 应该等到playerStatsPromise 中包含的所有承诺都解决了吗?

那么为什么All DoneGrab Done 之前完成呢?

【问题讨论】:

  • 您的代码没有意义。 forEach 尤其会引起副作用,但是您在其中返回了一个新的 Promise。
  • data2 来自更大的承诺链。 @aaaaaa 我这样做是为了尝试强制返回一个 Promise,这只是我在试验。
  • 如果你在其中使用了一个 Promise,你永远不应该创建一个 new Promise,你应该直接使用它们作为返回。此外,在getPlayersStats 失败的情况下,您将破坏您的代码,因为您从不处理以getPlayersStats 开头的链的拒绝情况。
  • 是的,我真的需要写下我的捕获。谢谢:D

标签: javascript node.js promise


【解决方案1】:

在构建数组playerStatsPromise 时,您似乎引用了一个未定义的变量data2。而是使用map 来构建您的数组,因为这将返回承诺:

  var playerStatsPromise = passData.savedDBGames.map((gameInfo) => {
    return new Promise((resolve, reject) => {
      stats.getPlayersStats(gameInfo.fixtureID).then((playerStats) => {
         console.info('Grab Done');
         resolve();
       });
    });
  });

  Promise.all(playerStatsPromise)
    .then(function () {
      console.info('All Done');
      app.io.emit('admin', 'Admin: done');
      resolve(passData);
    });

如果这是您在第一个代码块中所做的全部,您可以简化为:

  var playerStatsPromise = passData.savedDBGames
      .map(gameInfo => stats.getPlayersStats(gameInfo.fixtureID));

  Promise.all(playerStatsPromise)
    .then(function () {
      console.info('All Done');
      app.io.emit('admin', 'Admin: done');
      resolve(passData);
    });

【讨论】:

  • 奇怪...我在其他任何地方都使用过地图 :) 但由于某种原因,我脑子里放了个屁。不错的一个
猜你喜欢
  • 2020-06-23
  • 1970-01-01
  • 2021-05-19
  • 2019-05-28
  • 1970-01-01
  • 1970-01-01
  • 2017-04-02
  • 2019-01-06
  • 1970-01-01
相关资源
最近更新 更多