总体来说,我对Node.js和javascript非常陌生。我正在尝试从控制器方法实现响应,该方法将从查询返回结果。当前,响应是在查询完成之前发送的。非常感谢您提供一些有关如何解决此问题的建议。
我已经尝试实现回调,但是似乎无法使其按预期工作。我知道只有在发送响应后,才能在project.push()上设置一个断点。
function getProjects(callback){
var projects = [];
Project.find({}, function (err, docs){
if (!err){
docs.forEach((doc) => {
Task.find({project_id: doc._id}, function(err, tasks){
var tasks_count = tasks.length;
var project = {
name: doc.name,
tasks: tasks_count,
_id: doc._id
};
projects.push(project);
});
});
} else {
throw err;
}
callback(projects);
});
};
router.get('/projectlist', function (req, res) {
getProjects(function(projects){
res.json(projects);
});
});
上面的代码将发送一个空响应,然后继续并将实际结果推入数组。任何帮助将不胜感激!
答案 0 :(得分:2)
为确保顺序执行,您可以使用“异步+等待”语法。
答案 1 :(得分:2)
您在错误的位置调用了回调。注意Task.find是异步的。 您可以使用异步https://www.npmjs.com/package/async 处理异步呼叫。
function getProjects(callback) {
var projects = [];
Project.find({}, function (err, docs) { //first async call
if (!err) {
async.each(docs, (doc, key, callback) => {
Task.find({ project_id: doc._id }, function (err, tasks) { //second async call
var tasks_count = tasks.length;
var project = {
name: doc.name,
tasks: tasks_count,
_id: doc._id
};
projects.push(project);
return callback(); //this callback tell async that it can move to the next element in the array
});
}, function (err) { //this function will be call after all the element in the array are returned
if (err) {
return callback(err);
}
// now you can call your callback, the convention is to call the callback with callback(error, data);
callback(null, projects); //we have no errors so we pass null
});
} else {
return callback(err);
}
});
};
我没有运行代码,但是应该可以。希望这些评论对您有帮助。