我有这个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);
答案 0 :(得分:0)
问题是您在承诺回调中引用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
,因为我认为这可能是您的初衷。