Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何确保nodejs的顺序执行,以便从查询返回结果?_Javascript_Node.js_Mongoose - Fatal编程技术网

Javascript 如何确保nodejs的顺序执行,以便从查询返回结果?

Javascript 如何确保nodejs的顺序执行,以便从查询返回结果?,javascript,node.js,mongoose,Javascript,Node.js,Mongoose,一般来说,我对nodejs和javascript非常陌生。我试图实现一个来自控制器方法的响应,该方法将从查询返回一个结果。当前,响应在查询完成之前发送。如果您能就如何处理这一问题提供一些建议,我将不胜感激 我曾尝试实现回调,但似乎无法使其按预期工作。在project.push()上设置断点我知道它只在发送响应后才进行推送 function getProjects(callback){ var projects = []; Project.find({}, function (e

一般来说,我对nodejs和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);
    });
});

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

为了确保顺序执行,可以使用“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数组后返回它。感谢您的回复。打回电话的正确地点在哪里?对不起,我的手机上写不出合适的答案:/。但是请查看异步文档中的第一个示例谢谢您的回复。打回电话的正确地点在哪里?对不起,我的手机上写不出合适的答案:/。但是请检查异步文档中的第一个示例