2016-01-10 58 views
0
的NodeJS伊夫

得到这个JSON标记: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会在每个类别和作出新的承诺为每一个。

对于一些未知的原因,它总是跳过的第一个元素,并用出界异常

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

的存在的问题是,如果引用在自己的诺言回调ii改变每一秒。所以你的回调在未来某个时候会被执行,当时i === categories.length,这将是一个无效的索引。

由于您已经有了一个闭包,只需将当前类别对象存储在您的承诺回调之外的变量中,并将其引用。

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

+0

谢谢!就是这样! – Daedalus