所以我有一些带有一些帮助服务的风帆应用程序,以便更容易创建和获得复杂的模型。 其中一个是
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?
答案 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+,请告诉我,因为它变得更简单。