gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 00:50:24 25 4
gpt4 key购买 nike

我会尽量保持简单。下面的函数似乎以一种非常奇怪的方式运行。我从测试打印中获得的输出顺序为 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/

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