Javascript 如何确保nodejs的顺序执行,以便从查询返回结果?
一般来说,我对nodejs和javascript非常陌生。我试图实现一个来自控制器方法的响应,该方法将从查询返回一个结果。当前,响应在查询完成之前发送。如果您能就如何处理这一问题提供一些建议,我将不胜感激 我曾尝试实现回调,但似乎无法使其按预期工作。在project.push()上设置断点我知道它只在发送响应后才进行推送Javascript 如何确保nodejs的顺序执行,以便从查询返回结果?,javascript,node.js,mongoose,Javascript,Node.js,Mongoose,一般来说,我对nodejs和javascript非常陌生。我试图实现一个来自控制器方法的响应,该方法将从查询返回一个结果。当前,响应在查询完成之前发送。如果您能就如何处理这一问题提供一些建议,我将不胜感激 我曾尝试实现回调,但似乎无法使其按预期工作。在project.push()上设置断点我知道它只在发送响应后才进行推送 function getProjects(callback){ var projects = []; Project.find({}, function (e
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);
});
});
上面的代码将发送一个空响应,然后继续并将实际结果推送到数组。非常感谢您的帮助 为了确保顺序执行,可以使用“async+await”语法
为了确保顺序执行,可以使用“异步+等待”语法
您在错误的位置调用回调。请注意,Task.find是异步的。 您可以使用异步 来处理异步调用
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);
}
});
})
我没有运行代码,但应该可以运行。希望这些评论能对你有所帮助。你打回电话的地方不对。请注意,Task.find是异步的。 您可以使用异步 来处理异步调用
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);
}
});
})
我没有运行代码,但应该可以运行。希望这些评论能对你有所帮助。你应该使用承诺。这里有什么问题?运行代码的结果是什么?这和你想要的有什么不同?谢谢你的回复。问题是res.json(projects);在将任何内容推送到forEach中的数组之前调用。我希望在forEach完成后执行回调,但我知道异步不能这样工作,我只是无法实现它,这样项目数组只能在填充后返回。您应该使用承诺。这里有什么问题?运行代码的结果是什么?这和你想要的有什么不同?谢谢你的回复。问题是res.json(projects);在将任何内容推送到forEach中的数组之前调用。我希望在forEach完成后执行回调,但我知道异步不能这样工作,我似乎无法实现它,因此只能在填充完projects数组后返回它。感谢您的回复。打回电话的正确地点在哪里?对不起,我的手机上写不出合适的答案:/。但是请查看异步文档中的第一个示例谢谢您的回复。打回电话的正确地点在哪里?对不起,我的手机上写不出合适的答案:/。但是请检查异步文档中的第一个示例