2016-01-10 59 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