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 因为我认为这可能是你的初衷。