Почему несколько вызовов $.getJSON не работают должным образом?

Пожалуйста, взгляните на этот код:

$(document).ready(function() {
        var urls = ['http://en.wikipedia.org/w/api.php?action=query&titles=File:Einstein2.jpg&prop=imageinfo&iiprop=url&iiurlwidth=144&format=json&callback=?', 'http://en.wikipedia.org/w/api.php?action=query&titles=File:Da_Vinci_Vitruve_Luc_Viatour.jpg&prop=imageinfo&iiprop=url&iiurlwidth=144&format=json&callback=?', 'http://en.wikipedia.org/w/api.php?action=query&titles=File:2003-32-GravitationalLens.jpg&prop=imageinfo&iiprop=url&iiurlwidth=144&format=json&callback=?'];
        var x = 0;
        var f = function() {
            x++;
            console.log(x);
        };
        $.getJSON(urls[0], function(json) { f(); } );
        $.getJSON(urls[1], function(json) { f(); } );
        $.getJSON(urls[2], function(json) { f(); } );
    });

Результатом этого кода является «1», а я ожидал «1 2 3».

Я видел решения для этого (например, в этом SO-вопросе). Но я до сих пор не могу понять, почему данное решение должно работать, а приведенный выше код - нет.

ДОБАВЛЕНО: когда я добавляю некоторый код между вызовами $.getJSON или меняю console.log() на alert(), вывод действительно "1 2 3". Когда эти методы вызываются точно друг за другом, в Chrome вывод становится «1».

ДОБАВЛЕНО: Странная вещь. Совершенно не меняя код, я получил 3 разных вывода "1", "1 2", "1 2 3", просто перезагрузив страницу...


person Sergey    schedule 29.01.2012    source источник
comment
Какой результат вы ожидаете? Какой результат вы получаете? Правильно определяйте работу   -  person Quentin    schedule 29.01.2012
comment
Спасибо, что заметили, я отредактировал вопрос.   -  person Sergey    schedule 29.01.2012
comment
Результат выполнения этого кода есть 1 2 3 — jsfiddle.net/njxR7 . Похоже, вы создали сокращенный тестовый пример, который свел проблему к нулю.   -  person Quentin    schedule 29.01.2012
comment
Квентин прав... результат 123... но 1 не обязательно исходит из первого $.getJSON. См. измененный пример jsfiddle.net/GG8Uf   -  person devnull69    schedule 29.01.2012
comment
@Quentin, когда я помещаю некоторый код между вызовами $.getJSON или меняю console.log() на alert(), вывод действительно равен 1 2 3. Когда эти методы вызываются точно один за другим, в Chrome вывод становится равным 1.   -  person Sergey    schedule 29.01.2012
comment
Странная вещь. Вообще не меняя код, я получил 3 разных вывода 1, 1 2, 1 2 3, просто перезагрузив страницу...   -  person Sergey    schedule 29.01.2012
comment
Я получаю 1 2 3 каждый раз в Chrome, используя копирование/вставку вашего кода: jsfiddle.net /Энкосия/McYjd. Это не должно иметь значения, но какой браузер вы используете?   -  person Dave Ward    schedule 29.01.2012


Ответы (2)


Вы можете попытаться вложить такие запросы

 $.getJSON(urls[0], function(json) { 

    f();

     $.getJSON(urls[1], function(json) { f();

      $.getJSON(urls[2], function(json) { f(); 
      } );

     } );

   } );
person user1510230    schedule 19.07.2012

Ваш пример на самом деле работает так, как вы задумали. Как в Firefox, так и в Chrome я вижу в выводе консоли:

1
2
3
person Nathan Bell    schedule 16.06.2012