Nodejs混合了asynchronous函数和promise

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

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; }); 

}

麻烦的是当我试图调用这个函数来得到结果(插入价值指数列表)我不能找出正确的方法来从asynchronous瀑布返回结果:

 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)) }); 

这里的优点打印结果是未定义的。 有没有办法把asynchronous瀑布视为承诺,然后使用,而不是执行?

你不需要使用async.waterfall因为你已经有承诺,承诺已经链 – 所以增加另一个逻辑库是多余的。 水线已经使用了方便的蓝鸟许诺。

你的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 } 

PS如果你使用Node 4+,让我知道,因为它变得更简单。