Nodejs混合异步函数和promises

时间:2015-10-12 20:50:53

标签: node.js asynchronous sails.js waterline

所以我有一些带有一些帮助服务的风帆应用程序,以便更容易创建和获得复杂的模型。 其中一个是

getMerits: function(profileId, limit){
return async.waterfall([
  function(callback){
    Merit.find({employeeProfile: profileId}).then(function(merits){
      callback(null, merits);
    });
  },
  function(merits, callback){
    async.forEach(merits, function(item, loop_callback){
      MeritIndex.findOne({id: item.index}).then(function(meritIndex){
        merits[merits.indexOf(item)].index = meritIndex;
        loop_callback();
      });
    }, function(err, results){
      callback(null, merits);
  });
  }
], function(err, results){
  return results;
});

}

问题是当我尝试调用此函数来获取结果时(插入了meritindexes的优点列表。)我无法找出从异步瀑布返回结果的正确方法:

async.forEach(profiles, function(item, loop_callback){
      MeritService.getMerits(item.id, 5).exec(function(err, merits){
        console.log(merits)
        profiles[profiles.indexOf(item)].merits = merits;
        loop_callback();
      });
      // MeritService.getMerits(item.id, 5).exec(function(m){
      //   console.log(m)
      //   profiles[profiles.indexOf(item)].merits = m;
      //   loop_callback();
      // });
    }, function(err){
        console.log("PROFILES" + JSON.stringify(profiles))
    });

这里的优点打印导致未定义。有没有办法将异步瀑布视为承诺,然后使用而不是exec?

1 个答案:

答案 0 :(得分:1)

您不需要使用async.waterfall,因为您已经拥有承诺,承诺链已经存在 - 因此为该逻辑添加另一个库是多余的。 Waterline使用蓝鸟承诺,已经有方便的方法。

您的getMerits可以写成:

getMerits: function(profileId, limit){
  var merits = Merit.find({employeeProfile: profileId}); 
  var items = merits.map(function(item) {
    return MeritIndex.findOne({id: item.index }).then(function(meritIndex) {
      item.index = meritIndex;
    });
  });
  return items.return(merits); // wait for items to be done, and return the merits
}

P.S。 如果你使用Node 4+,请告诉我,因为它变得更简单。

相关问题