等待解决多个callback

我试图从mongoose一次调用中获取ID。 之后,这些ID中的每一个都用来进行另一个返回多个对象的调用。 我正在尝试获取所有这些对象。

我目前的尝试看起来像这样:

var members; var memberTimes = []; // Use the Group model to find a specific group Group.find({ members: { $elemMatch: { $eq: req.user._id } }, _id: req.params.group_id }, function(err, group) { if (err) { res.send(err); } else if (!group) { //res.send(new Error("User not in group or it does not exist")); } members = group[0].members; for (var member of members) { // Use the Time model to find a specific time Time.find({ user_id: member }, function(err, times) { if (err) { res.send(err); } for (var time of times) { memberTimes.push(time); } }); } //on completion of all above code, execute res.json(memberTimes); }); 

但是,这不起作用,因为我没有等待Time#find的所有callback。 我已经看过使用承诺,但我不确定究竟是如何工作的。

有谁知道这是如何工作的?

谢谢Daniel

是的, 应用承诺听起来是个好主意。

你将需要select一个实现 ,它将取决于如何promisify您的find方法调用。 让我们假设你有一个find函数,接收器和选项,并返回一个承诺 – (编辑)mongoose,你很幸运, .exec()已经似乎承诺:

 function find(model, options) { return model.find(options).exec(); } 

那么你的代码将如下所示:

 find(Group, { members: {$elemMatch: {$eq: req.user._id}}, _id: req.params.group_id }).then(function(group) { if (!group) throw new Error("User not in group or it does not exist"); return Promise.all(group[0].members.map(function(member) { return find(Time, {user_id: member}); })); }).then(function(memberTimes) { res.json(memberTimes); }, function(err) { res.send(err); }); 

在这里, Promise.all是等待多个时间查找承诺解决(并行)的部分。

你需要做asynchronous循环,并等待最终的响应。 你可以做类似的事情

 var members; function getTimes(mTimes, times, i, done) { console.log("time " + i); if (i < times.length) { console.log(times[i]); mTimes.push(times[i]); getTimes(mTimes, times, i + 1, done); } else { done(mTimes); } } function asyncLoop(memberTimes, members, i, callback) { if (i < members.length) { Time.find({ user_id: members[i] }, function(err, times) { if (err) { res.send(err); } console.log(times); getTimes(memberTimes, times, 0, function(result) { asyncLoop(memberTimes, members, i + 1, callback); }); }); } else { callback(memberTimes); } } // Use the Group model to find a specific group Group.find({ members: { $elemMatch: { $eq: req.user._id } }, _id: req.params.group_id }, function(err, group) { if (err) { res.send(err); } else if (!group) { //res.send(new Error("User not in group or it does not exist")); } members = group[0].members; var memberTimes = []; asyncLoop(memberTimes, members, 0, function(memberTimes) { res.json(memberTimes); }); }); 

上面的代码可能无法运行,因为我没有运行它,但这是如何实现你想要的。