繁体   English   中英

Node.js Promise.all()挂起

[英]Node.js Promise.all() hanging

有点卡在这一个。 在node.js上使用https://github.com/then/promise

exports.count = function ( models, callback ) {
  var promises = [];

  models.forEach(function ( name ) {
    promises.push( countOne( name ) );
  });

  Promise.all( promises ).then(function ( res ) {
    callback( null, res );
  });

  Promise.resolve(promises[0]).then(function (res) {
    console.log('resolved individual with res', res);
  });
};

function countOne ( exampleArg ) {
  return new Promise(function ( resolve, reject ) {
    // It resolves or rejects
  });
}

我也尝试过:

Promise.all( promises.map(function ( it ) { return Promise.resolve(it); }) ).then(function ( res ) {
  callback( null, res );
});

无论哪种方式,Promise.all都不会触发。 Promise.resolve确实给出了适当的响应。

否则,您的承诺之一就是没有兑现,在这种情况下,您需要找出哪一个。

我认为您正在尝试使用console.log做到这一点。 如果使用forEach做到这一点,则可以将日志消息附加到所有promise,并查看哪个未解决/拒绝。

或者其中一项承诺是拒绝,您没有处理。

我自由地重写了代码,可以这样尝试:

exports.count = function (models, callback) {
    var allCounts = models.map(countOne);

    // second parameter is the onRejected handler
    Promise.all(allCounts).then(function (res) {
        callback(null, res);
    }, function (err) {
        callback(err);
    });

    promises[0].then(function (res) {
        console.log('resolved individual with res', res);
    });
};

我离开了回调,但实际上我只是返回了诺言,变得更加简单,清晰。

ProTip™:
切换到bluebird promise库 ,并用一行替换您的实现:

exports.count = function (models, callback) {
    Promise.map(models, countOne).nodeify(callback);
}

可能会更快。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM