JSON 数组迭代跳过第一个元素 - NodeJS
JSON array iteration skips first element - NodeJS
我有这个 JSON 标记:
"Categories": [
{"name": "a", "id": "1"},
{"name": "b", "id": "2"},
{"name": "c", "id": "3"},
{"name":"d", "id": "4"},
{"name":"e", "id": "5"},
{"name": "f", "id": "6"},
{"name": "g", "id": "7"},
{"name": "h", "id": "8"}
]
我有一个 setInterval 遍历每个类别并为每个类别创建一个新的 Promise。
由于某些未知原因,它总是跳过第一个元素并存在越界异常
var i = 0;
var id = setInterval(function(){
if (i == categories.length){
clearInterval(id);
}
client.itemSearch({
category: categories[i].id,
catName: categories.name,
}).then(function(results){
console.log("From category - " + categories[i].name + "\n" +
"Title: " + results[0].Title);
},function(err) {
console.log("error at " + categories[i].name);
});
i+=1;
}, 1000);
问题是您在 promise 回调中引用了 i
,并且 i
每秒都在变化。因此,您的回调将在将来 i === categories.length
的某个时间执行,这将是一个无效索引。
由于您已经有一个闭包,只需将当前类别对象存储在您的 promise 回调之外的变量中并引用它。
您还让函数在 i === categories.length
时继续执行,这将导致无效的索引访问。
下面是解决上述问题的解决方案示例:
var i = 0;
var id = setInterval(function() {
if (i === categories.length) {
clearInterval(id);
return;
}
var category = categories[i];
client.itemSearch({
category: category.id,
catName: category.name,
}).then(function(results) {
console.log("From category - " + category.name + "\n" +
"Title: " + results[0].Title);
}, function(err) {
console.log("error at " + category.name);
});
i += 1;
}, 1000);
最后,你原来有 catName: categories.name
但我把它改成了 catName: category.name
因为我认为这可能是你的初衷。
我有这个 JSON 标记:
"Categories": [
{"name": "a", "id": "1"},
{"name": "b", "id": "2"},
{"name": "c", "id": "3"},
{"name":"d", "id": "4"},
{"name":"e", "id": "5"},
{"name": "f", "id": "6"},
{"name": "g", "id": "7"},
{"name": "h", "id": "8"}
]
我有一个 setInterval 遍历每个类别并为每个类别创建一个新的 Promise。
由于某些未知原因,它总是跳过第一个元素并存在越界异常
var i = 0;
var id = setInterval(function(){
if (i == categories.length){
clearInterval(id);
}
client.itemSearch({
category: categories[i].id,
catName: categories.name,
}).then(function(results){
console.log("From category - " + categories[i].name + "\n" +
"Title: " + results[0].Title);
},function(err) {
console.log("error at " + categories[i].name);
});
i+=1;
}, 1000);
问题是您在 promise 回调中引用了 i
,并且 i
每秒都在变化。因此,您的回调将在将来 i === categories.length
的某个时间执行,这将是一个无效索引。
由于您已经有一个闭包,只需将当前类别对象存储在您的 promise 回调之外的变量中并引用它。
您还让函数在 i === categories.length
时继续执行,这将导致无效的索引访问。
下面是解决上述问题的解决方案示例:
var i = 0;
var id = setInterval(function() {
if (i === categories.length) {
clearInterval(id);
return;
}
var category = categories[i];
client.itemSearch({
category: category.id,
catName: category.name,
}).then(function(results) {
console.log("From category - " + category.name + "\n" +
"Title: " + results[0].Title);
}, function(err) {
console.log("error at " + category.name);
});
i += 1;
}, 1000);
最后,你原来有 catName: categories.name
但我把它改成了 catName: category.name
因为我认为这可能是你的初衷。