javascript - 线路以奇怪的顺序运行

标签 javascript node.js mongodb express

我会尽量保持简单。下面的函数似乎以一种非常奇怪的方式运行。我从测试打印中获得的输出顺序为 1、4、3、2(带有空的 returnList)。

这似乎表明这些代码块内部的代码最后执行,您可能会猜到,当我想返回 returnList 时,这会产生一些问题。

var server = new mongo.Server('localhost', 27017);
var db = new mongo.Db('tdp013', server);

app.get('/getall', function (req, res) {

    var returnList = [];
    console.log("1");

    db.open(function(err, client){
        client.collection("messages", function(err, col){
            col.find({}, function(err, cursor){
                cursor.each(function(err, item){

                    if(item!=null){
                        console.log("2");
                        returnList.push(item);
                    }

                });
                console.log("3");
            });
        });
    });
    console.log("4");
    console.log(returnList);
    res.sendStatus(200);
});

我的问题很简单,对于为什么/如何这些行没有按书面顺序执行,是否有一个很好的解释(缺乏更好的词)?

或者,有没有一种方法可以返回 returnList 而无需在迭代中执行它?

最佳答案

这就是 Node.js 通过使用 JavaScript 进一步强化的异步特性。

您尝试读取此代码并通过其顺序(即同步)执行进行推理,但这不是它的工作方式。

console.log('1');

db.open(function (err, db) {
    // ...
});

console.log('4');

以上面的代码片段为例。 期望db.open()中的函数在继续将4写入控制台之前完成,但事实并非如此。所发生的情况是, Node 将异步运行 open() 方法并继续执行下一个代码(此处为 console.log('4');)。当该 open() 方法完成运行时,它将启动参数列表中定义的回调函数。

这是异步 JavaScript。您不能指望它会在编辑器中同步/顺序运行这样编写的代码。

开发逻辑按照您希望的方式(看起来)流动,必须像下面这样重构:

var server = new mongo.Server('localhost', 27017);
var db = new mongo.Db('tdp013', server);

app.get('/getall', function (req, res) {

    var returnList = [];
    console.log("1");

    db.open(function(err, client){
        client.collection("messages", function(err, col){
            col.find({}, function(err, cursor){
                cursor.each(function(err, item){

                    if(item!=null){
                        console.log("3");
                        returnList.push(item);
                    }
                    else {
                        console.log("4");
                        console.log(returnList);
                        res.sendStatus(200);
                    }

                });
                console.log("2");
            });
        });
    });
});

关于javascript - 线路以奇怪的顺序运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32823366/

相关文章:

javascript - Highcharts 中的 "Nested labels"

javascript - 如何从 Service Worker 调用缓存的 ManifestEntry Javascript 函数?

node.js - Node 调度程序不是每天都运行

javascript - 如何将 ng-Model 的值获取到 Controller angular js

javascript - 有没有办法在 Angularjs 的指令中获取子元素的宽度和高度

javascript - 将pdf文件放入子文件夹中

node.js - NodeJS : Node-Inspector blank screen

javascript - MongoDB 2.0.0 驱动程序,按 ID 检索记录的问题

javascript - Mongodb/mongoose 只保存一次然后创建 500 错误

mongodb - 如何在 MongoDB 中设置具有自动增量的主键?