Здравствуйте. Помогите, пожалуйста разобраться. Почему не работает код?
Задача простая: мне нужно перебрать несколько 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();
});
Вопрос - почему этот код не работает? Как только я внутри if{}, else {} пытаюсь обратиться к своему массиву chObjArr, то код перестает работать и в результате ничего не выводится? Скажем, если я заменю внутри if строки:
console.log(chObjArr[i].name + " online");
на просто: console.log(" online ");
то все выводится в консоль и работает как надо.
Еще вопрос - почему аналогичный, на мой взгляд, код работает успешно? Только в нем вместо цикла 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'); } }); }); }
Я поискал похожие темы на форуме, но не нашел ответа конкретно на свои вопросы. Спасибо.
iк моменту выполнения анонимных обработчиков, передаваемых в$.getJSON. Вам подойдет:$.getJSON('...', (function(data){ console.log(this.name); }).bind(chObjArr[i]) );. – Sep 08 '17 at 14:03