JSON数组迭代跳过第一个元素 - NodeJS

时间:2016-01-10 23:02:20

标签: arrays json node.js setinterval indexoutofboundsexception

我有这个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);

1 个答案:

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