Node.js bluebird.map意外结果

时间:2015-08-13 23:29:04

标签: javascript node.js asynchronous bluebird

我一直在使用node.js,我需要检查一个带有jsons的数组并更新一些项目,最后返回更新的数组。 我正在做的是类似以下内容:(主应用程序使用快速和续集)

exports.getDetails = function (req, res) {
  var accountsArray = [];

  bluebird.map(req.accounts, function(account, callback){
     if (account.type == 'A'){
         if (account.param == req.body.paramSearch){
            account.updateAttributes({
                   param: req.body.paramSearch
            }).then(function(updatedAccount){
                console.log('A type entry');
                accountsArray.push(updatedAccount);
            });
         }
         else{
            console.log('A type entry');
            accountsArray.push(account);
         }
     }
     if (account.type == 'B'){
         if (account.param == req.body.paramSearch){
            account.updateAttributes({
                   param: req.body.paramSearch
            }).then(function(updatedAccount){
                console.log('B type entry');
                accountsArray.push(updatedAccount);
            });
         }
         else{
            console.log('B type entry');
            accountsArray.push(account);
         }
     }
  }).then(function(){
     console.log('Bluebird.map done');
     res.status(200).json({
        data: {
           accounts: accountsArray
        }
     });
  });

我打算做的是首先将所有帐户(更新或不更新的受害者)添加到accountsArray,然后使用accountsArray返回json。

相反,我得到的是一个空账户。我在代码中使用了console.log来跟踪处理的内容。我总是得到的是像

Bluebird.map done
A/B type entry
...
A/B type entry

预期是

A/B type entry
...
A/B type entry
Bluebird.map done

我是node.js的新手,这个异步处理仍让我感到困惑。 反正是否确保我已经完成了地图部分内的子功能,然后继续进行响应?如果可能,使用Bluebird。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

尽管map有效,但在您的用例中您需要的是bluebird.each,它旨在用于具有副作用的函数中。另一个问题是,你并没有return内在的承诺。请参阅下面的修复。

 bluebird.each(req.accounts, function(account){
     if (account.type == 'A'){
         if (account.param == req.body.paramSearch){
            return account.updateAttributes({
                   param: req.body.paramSearch
            }).then(function(updatedAccount){
                console.log('A type entry');
                accountsArray.push(updatedAccount);
            });
         }
         else{
            console.log('A type entry');
            accountsArray.push(account);
         }
     }
     if (account.type == 'B'){
         if (account.param == req.body.paramSearch){
            return account.updateAttributes({
                   param: req.body.paramSearch
            }).then(function(updatedAccount){
                console.log('B type entry');
                accountsArray.push(updatedAccount);
            });
         }
         else{
            console.log('B type entry');
            accountsArray.push(account);
         }
     }
  }).then(function(){
     console.log('Bluebird.map done');
     res.status(200).json({
        data: {
           accounts: accountsArray
        }
     });
  });