gpt4 book ai didi

javascript - 如何确保 nodejs 的顺序执行以从查询返回结果?

转载 作者:行者123 更新时间:2023-11-30 09:16:40 27 4
gpt4 key购买 nike

总的来说,我对 nodejs 和 javascript 还很陌生。我正在尝试实现来自 Controller 方法的响应,该方法将从查询返回结果。目前,响应是在查询完成之前发送的。非常感谢有关如何处理此问题的一些建议。

我已尝试实现回调,但似乎无法使其按预期工作。在 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);
});
});

上面的代码将发送一个空响应,然后继续将实际结果推送到数组。非常感谢任何帮助!

最佳答案

您在错误的地方调用回调。请注意,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);
}

});

};

我没有运行代码,但它应该可以运行。希望评论对您有所帮助。

关于javascript - 如何确保 nodejs 的顺序执行以从查询返回结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54658650/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com