0

Ive получил эту JSON разметку:JSON массив итерация пропускает первый элемент - NodeJS

"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"} 
     ] 

Ive обзавелся 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

Проблема заключается в том, что вы ссылки i в своем обещании обратных вызовов и i меняется каждую секунду. Таким образом, ваши обратные вызовы выполняются когда-нибудь в будущем, когда 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

 Смежные вопросы

  • Нет связанных вопросов^_^