0

Здравствуйте. Помогите, пожалуйста разобраться. Почему не работает код?

Задача простая: мне нужно перебрать несколько url'ов, подсовывая их в $.getJSON, затем проверить одну переменную в полученном от сервера json объекте и в зависимости от ее значения вывести результат. Код таков:

var chObjArr = [
        { name: 'ESL_SC2',      online: null },
        { name: 'OgamingSC2',   online: null },
        { name: 'cretetion',    online: null },
        { name: 'freecodecamp', online: null },
        { name: 'storbeck',     online: null },
        { name: 'habathcx',     online: null },
        { name: 'RobotCaleb',   online: null },
        { name: 'noobs2ninjas', online: null }        
        ];


 function myUpdateList() {
      for(var i = 0; i < chObjArr.length; i++) {    

        $.getJSON('https://wind-bow.gomix.me/twitch-api/streams/' + chObjArr[i].name + '?callback=?', function(data) {

          if(data.stream) { //its online


            console.log(chObjArr[i].name + " online");

          }
          else { //offline


            console.log(chObjArr[i].name + " offline");

          }        
        });      
      }

 $(document).ready(function() {

    myUpdateList();

    });
  1. Вопрос - почему этот код не работает? Как только я внутри if{}, else {} пытаюсь обратиться к своему массиву chObjArr, то код перестает работать и в результате ничего не выводится? Скажем, если я заменю внутри if строки:

    console.log(chObjArr[i].name + " online");

на просто: console.log(" online ");

то все выводится в консоль и работает как надо.

  1. Еще вопрос - почему аналогичный, на мой взгляд, код работает успешно? Только в нем вместо цикла for используется forEach. Это как-то связано с тем, что в случае forEach создается новый объект — итератор? Как это объяснить?

          function updateList() {
          chObjArr.forEach(function(channel) {
          $.getJSON('https://wind-bow.gomix.me/twitch-api/streams/' + channel.name + '?callback=?', function(data) {
    
            if (data.stream) {
    
            // channel is online
            console.log(channel.name + ' is online');
    
          } else {
    
            // channel is offline        
            console.log(channel.name + ' is offline');
    
          }
        });
      });
    }
    

Я поискал похожие темы на форуме, но не нашел ответа конкретно на свои вопросы. Спасибо.

200OK
  • 195
  • @Grundy-y-y! У Вас, я полагаю, ссылка на существующий вопрос находится в буфере обмена? –  Sep 08 '17 at 13:57
  • 1
    @Igor, нет, просто популярные вопросы иногда получается поиском искать :) – Grundy Sep 08 '17 at 13:58
  • @C01 Как Вы уже поняли, дело в значении переменной i к моменту выполнения анонимных обработчиков, передаваемых в $.getJSON. Вам подойдет: $.getJSON('...', (function(data){ console.log(this.name); }).bind(chObjArr[i]) );. –  Sep 08 '17 at 14:03
  • Спасибо за полезные ответы! – 200OK Sep 08 '17 at 14:09

0 Answers0