- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我会尽量保持简单。下面的函数似乎以一种非常奇怪的方式运行。我从测试打印中获得的输出顺序为 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/
在典型的 TSP 算法中,我们有多个点,我们希望以最优的行进顺序行进。点是家庭、客户等,基本上是 map 上的一个点。 我有线来优化,而不是点。扫雪机就是一个很好的例子,您可以在多条街道上行驶。最大的
对于我的计算机视觉类(class),我将做一个项目,我将根据走廊的图像提取关于走廊的信息。特别是,向消失点延伸的走廊线会很有趣。我的问题是我是否应该使用 Matlab、OpenCV 或其他东西来实现这
是否有任何工具可以查看 HTTP 2.0 的传输情况(原始请求和响应)?我使用 Fiddler,只看到 HTTP 1.1 数据。 我在 Chrome 中启用了 HTTP 2.0/SPDY 并访问了 h
我们想对我们办公室的两条 ADSL 线路进行负载平衡。 我对 is 的经验有限,想知道是否有人可以为我提供理论之外的解决方案,换句话说,关于硬件和软件要求和建议的细节。 所以我们有 2 条 4mb A
Warning: Error in parsing value for 'display'. Declaration dropped. Line: 0 我不确定当我留下这个警告时会发生什么,因为我没有
我想知道这条 SDP 线的含义是什么,因为我正试图在 5% 到 10% 的数据包丢失情况下获得最平滑的帧速率。 我不知道的行是:a=rtcp-fb:100 goog-remba=rtcp-fb:100
出于某种原因,我在我的所有 CSS 文件中都收到了这个警告/错误,但我不太明白。当我通过 W3C Validator 运行我的 CSS 时结果 100% 有效且格式正确等。但是,在 Firefox 中
我是一名优秀的程序员,十分优秀!