线路以奇怪的顺序运行

我会尽量保持这个尽可能简单。 以下function似乎以非常奇怪的方式运行。 我从testing中得到的输出是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); }); 

我的问题只是这个,有没有一个很好的解释(缺less一个更好的词),为什么/如何不按照书面顺序执行这些行?

或者,有没有办法返回returnList没有在迭代?

这只是node.js通过使用JavaScript进一步强化的asynchronous性质。

你试图通过它的顺序执行(即同步)来读取这段代码和原因,但这不是它的工作原理。

 console.log('1'); db.open(function (err, db) { // ... }); console.log('4'); 

以上面的代码片段为例。 希望 db.open()的函数在继续向控制台写入4之前完成,但事实并非如此。 会发生什么事是节点将asynchronous运行open()方法,并继续下一个代码(这里,这将是console.log('4'); )。 当open()方法完成运行时,它将启动参数列表中定义的callback函数。

这是asynchronousJavaScript。 你不能期望它在你的编辑器中以这种方式同步/按顺序编写代码。

开发逻辑将stream动的方式(它出现),你想它stream动,它将不得不重构如下:

 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"); }); }); }); }); 

Node.js本质上是asynchronous的,在单线程事件循环上运行。

例子:假设你已经触发了一个数据库查询,并且你正在等待查询来执行,然后继续进行下去,但是在同一时间,那些不依赖于数据库查询的代码将会发生什么,它们将不会执行并等待轮到他们。

asynchronous与此完全相反。 当你在做数据库查询的时候,Node.js会继续执行代码,当数据库查询完成时,它会回来处理它。

所以在你的情况下,你已经添加了console.log("2");console.log("3"); 在callback函数中,这些行在执行的时候执行。 和console.log("4"); 不会等待db.open方法完成。 因此,结果是1,4,3,2。

所以为了确保returnList返回正确的数据,你必须在callback方法本身中添加它。

希望这会帮助你理解你面临的问题。