2013-03-10 2 views
0

Я огляделся в течение нескольких часов, и я честно не понимаю, почему это не работает. Хотя я и понял сферу действия, но я думаю, что это связано с обратным вызовом метода .popular. Любой совет?Array Scope Issue

var filters = []; //Global 

INSTAJAM.media.popular(function(popular){ 

    for (i in popular.data){ 
     filters.push(popular.data[i].filter); //Pushing to Global 
    } 

    console.log(filters); //Works fine 

}); 

console.log(filters); //Empty array 
+3

Ваш метод, скорее всего, асинхронный. – 0x499602D2

+0

, который звонит 'INSTAJAM.media.popular' –

ответ

2

Таковы причины, я могу думать о том, почему ваш второй console.log (фильтры) будет пустым:

  1. INSTAJAM.media.popular, скорее всего, асинхронная функция (он вызывает его обратный вызов через некоторое время, вероятно, в результате вызова ajax), а когда вы делаете второй console.log(filters);, вызов ajax еще не завершен, поэтому ваш обратный вызов, который заполняет глобальную переменную filters, еще не был вызван или запустить.
  2. var filters = []; на самом деле не является глобальным.
  3. В пределах видимости есть другая переменная с именем filters, поэтому вы фактически не изменяете глобальную.

Основываясь на структуре INSTAJAM.media.popular, которая принимает обратный вызов, моя догадка №1. Асинхронный javascript означает, что в серийном исполнении ничего не происходит. Вместо этого вы вызываете что-то вроде INSTAJAM.media.popular(fn), а через некоторое время обратный вызов вызывается, когда вызов ajax завершается. Это означает, что код, расположенный сразу после вызова INSTAJAM.media.popular(fn), не может использовать результаты этого вызова. Вместо этого любой код, который хочет использовать эти результаты, должен быть в самом обратном вызове или вызван из обратного вызова.

+0

Я смотрел проверенные варианты 2 и 3, поэтому он должен быть # 1. Есть ли способ обойти это? –

+0

@MateiGheorghiu - перестройте свой код для работы с асинхронными операциями, как я описал в своем последнем абзаце. Если 'INSTAJAM.media.popular()' is async, это ТОЛЬКО. – jfriend00

+0

Человек, мне жаль, что я боюсь, но я никогда раньше не работал с асинхронными функциями. Я не уверен, куда идти. –

0

вы можете ссылаться на window.filters