【发布时间】:2016-06-10 09:45:09
【问题描述】:
我有一个 JSON 对象数组。这个数组在一个 for 循环中,当信息从数据库中可用时,它会不断地将它们添加到数组中。数组中的对象数量可能与从数据库返回的结果数量不同(因为只有某些位置可能具有用户正在搜索的食物类型)。
例如,我可以在rows 中返回 12 家餐厅,但只有 3 家卖汉堡,所以我不能简单地做if (rows.length - 1 == i),因为i 只会达到 2 而rows.length - 1 是 11 .
所以匹配的返回结果(JSON)在for循环中被一一添加。在将所有出售汉堡的餐厅都添加到数组之前,我永远无法预先知道有多少餐厅出售汉堡。
我尝试了各种技巧,我从节点得到的常见错误是“不能多次发送标头”。而且我知道为什么它给了我这个错误。它给了我这个错误,因为循环的每次迭代都会返回它在数组中的任何内容。
输出示例
第一次迭代:
{ "results": [ {"name_of_restaurant": "joes burgers", "open_now": true }] }
第二次迭代:
{ "results": [ {"name_of_restaurant": "joes burgers", "open_now": true }, { "name_of_restaurant": "five guys", "open_now": true }] }
第三次迭代:
{ "results": [ { "name_of_restaurant": "joes burgers", "open_now": true }, "{ name_of_restaurant": "five guys", "open_now": true },
" { name_of_restaurant": "shake shack", "open_now": true }]
}
我想要一种方法来捕获第三次迭代,以便将其发送回客户端。
明确地说,我不是在寻找array.length - 1。我的问题要复杂得多。
编辑 - 添加代码
function retrieveLocation(callback) {
var locationsWithinVisibleMapRectQuery = "SELECT * FROM locations WHERE Y(coordinates) > " + req.body.SWCoordLat + "AND Y(coordinates) < " + req.body.NECoordLat + "AND X(coordinates) > " + req.body.SWCoordLong + "AND X(coordinates) < " + req.body.NECoordLong + ";";
connection.query(locationsWithinVisibleMapRectQuery, function(err, rows) {
if (err) throw err;
var jsonObject = {
"results" : []
};
//console.log("Number of businesses: " + rows.length);
for(var i = 0; i < rows.length; i++) {
console.log("Business number " + i);
var businessName = rows[i].name;
console.log(businessName);
console.log();
var x = rows[i].coordinates.x;
var y = rows[i].coordinates.y;
getMenuForEachLocation(x, y, businessName, rows, i, function(err, obj) {
if (err) {
callback(err, null);
}
jsonObject["results"].push(obj);
if( jsonObject["results"] == the last index) { // figure a way to get last iteration to send back as a response
callback(null, jsonObject);
}
});
}
});
}
retrieveLocation(function(err, jsonObject) {
if (err) throw err;
res.json(jsonObject);
});
【问题讨论】:
-
为什么在包含 for 循环完成迭代之前返回结果?我们能看到构建这个数组的代码吗?
-
“我想要一种捕获第三次迭代的方法” 是否要求只在第三次迭代时执行一个过程?
-
我发布了我的代码给你看。
-
getCheckinsForEachLocation是异步的吗? -
你不能选择使用 Promise 吗?真的会在这里为您尝试做的事情提供帮助。
标签: javascript json node.js for-loop