簡體   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