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