【发布时间】:2017-06-30 21:09:58
【问题描述】:
我正在查询一个 mongo 数据库以检索用于在 rougelike 游戏中显示的图块。这是我使用的功能:
function get_display(){
var collections = ['austinsroom'];
var db = mongojs(uri, collections);
var temphtml = '';
for(var j = 0; j < 3; j++) {
console.log("y=" + String(j));
db.austinsroom.find({"y": j}, {}).sort({"x": 1}, function(err, records) {
if(err) {
console.log("There was an error executing the database query.");
return;
}
var i = records.length;
while(i--) {
temphtml += records[i].display;
}
temphtml += '<br>';
//console.log(temphtml);
//return temphtml;
//THE ONLY WAY I CAN GET ANYTHING TO PRINT IN THE CONSOLE IS IF I PUT IT INSIDE THE LOOP HERE
});
//console.log(temphtml);
//return temphtml;
//THIS DOES NOTHING
}
//console.log(temphtml);
//return temphtml;
//THIS DOES NOTHING
}
get_display();
如果我将console.log(temphtml) 放入循环中,它会打印三遍,这不是我想要的。我只想要最终的字符串(即...<br>...<br>...<br>。而且我最终无法返回temphtml 字符串,这实际上是重要的。这是javascript的一些怪癖吗?为什么它不会在循环后执行语句?
另外:有没有更好的方法来检索存储在 mongo 数据库中的网格的每个元素,以便它可以正确显示?以下是 mongo 文档的样子:
{
"_id": {"$oid": "570a8ab0e4b050965a586957"},
"x": 0,
"y": 0,
"display": "."
}
现在,游戏应该使用 x 和 y 坐标值在所有空白处显示“.”。数据库由“x”值索引。
【问题讨论】:
-
我不确定
db.austinsroom.find是什么,但它是一个异步函数吗?如果是,则意味着 for 循环可能在db.austinsroom.find调用之前完成,在这种情况下,temphtml变量中将没有任何内容... -
@IMTheNachoMan 关于
db.austinsroom.find是异步的是正确的(注意回调函数)。听起来你想要的是循环通过db.austinsroom.find1,2,3 THEN 打印。由于 1、2、3 包含异步调用,因此您需要找到一种方法来知道它们何时全部完成(或失败)。研究使用承诺 -
@KarlGalvez 但实际上有一些方法可以使用异步流控制“循环”,或者构建要返回的承诺列表。注意
mongojs驱动程序本身不支持承诺,但 MongoDB 的其他驱动程序支持。
标签: javascript node.js mongodb mongodb-query