Как я могу запустить какой-нибудь javascript перед функцией готовности документа?

Сначала я закончил следующий фрагмент ...

var applicantlist = [];
$.getJSON("apps.json", function(appsdata) {
    for (var i = 0; i<appsdata.applications.length; i++){
        var tempapp = [appsdata.applications[i].name, appsdata.applications[i].server];
        applicantlist.push(tempapp);
    }
});

Я проверил это, и данные без проблем помещаются в массив. Проблема в том, что мне нужен этот массив для выполнения некоторых вызовов ajax, которые находятся в моей функции готовности страницы следующим образом ...

$(document).ready(function(){
    window.jsonpCallbacks = {};
    alert(applicantlist.length);
    for (var i = 0; i < applicantlist.length; i++){
        (function(index){
            window.jsonpCallbacks["myCallback" + index] = function(data){
                myCallback(data,index);
            };
        })(i);
        //Jquery/Ajax call to the WoW API for the data.
        $.ajax({
            "url":"http://us.battle.net/api/wow/character/" + applicantlist[i][1] + "/" + applicantlist[i][0] + "?jsonp=jsonpCallbacks.myCallback" + i,
            "type":"GET",
            "data": { fields: "items, talents, progression, professions, audit, guild, stats"},
            "dataType":"jsonp",
            "contentType":"application/json",
            "jsonpCallback":"jsonpCallbacks.myCallback"+i,
            "success":function(data1){
            }
        })

    }

Все это срабатывает перед первым снайпером, куда бы я ни поставил. Итак, массив пуст (в предупреждающем сообщении отображается только «0»).

Как видно по URL-адресу моего вызова ajax, мне нужно заранее заполнить этот массив. Я попытался поместить первый фрагмент в отдельный файл .js и вызвать его перед всеми другими файлами javascript на реальной HTML-странице ...

Что мне не хватает?

1
Bonedancer 17 Мар 2014 в 00:31
2
Запуск его перед document.ready не поможет. Он по-прежнему асинхронный и не установит переменную до тех пор, пока не будет document.ready. Все, что зависит от результата AJAX, должно выполняться в его функции обратного вызова.
 – 
Barmar
17 Мар 2014 в 00:32
Здесь ничего не зависит от Ajax, Ajax зависит от массива.
 – 
Bonedancer
17 Мар 2014 в 00:51
Вы заполняете массив с помощью $.getJSON, то есть AJAX.
 – 
Barmar
17 Мар 2014 в 00:52
Я понимаю, что вы имеете в виду, извините. Итак, я придумаю новый способ сделать это.
 – 
Bonedancer
17 Мар 2014 в 00:54
Я не понимал, что именно со мной происходит, пока не увидел ваш вопрос в результатах поиска Google. Совершенно случайно я щелкнул по нему и прочитал вопрос, и что вы знаете, это то, с чем я столкнулся. Спасибо за хорошо сформулированный вопрос. :)
 – 
HPWD
24 Сен 2017 в 18:10

1 ответ

Лучший ответ

Переместите код, отправляющий первый запрос, в document.ready. Обычно вы не хотите, чтобы что-либо происходило до того, как документ будет готов. Затем переместите код, который отправляет следующий запрос (ы) в обратный вызов первого запроса после того, как вы заполните массив, и сделайте все, что вам нужно, сначала

$(document).ready(function () {
    $.getJSON("apps.json", function(appsdata) {
        ...
        // add items to your array
        sendNextRequest();
    }
});

function sendNextRequest() {
    //Jquery/Ajax call to the WoW API for the data.
    ...
}

Это гарантирует, что вызовы API WoW не запускаются до тех пор, пока не завершится первый вызов $ .getJSON и вы не заполните свой массив.

К вашему сведению, это обычная проблема в javascript. Вам нужно, чтобы одна операция запускалась только после завершения другой. Когда вы используете ajax, у вас есть обратные вызовы, как в моем примере выше, которые помогут вам в этом. Вне запросов ajax вы можете использовать jQuery Promises, чтобы отложить выполнение задач до тех пор, пока не завершится что-то еще.

2
Charlie Martin 17 Мар 2014 в 01:08
Это прекрасно работает, Чарли, еще раз спасибо за предложение.
 – 
Bonedancer
17 Мар 2014 в 01:37
Когда у меня есть один массив, это отлично работает. Однако, если у меня есть два вызова ajax, это не работает для обоих массивов, только для одного. У вас есть предложения по этому сценарию? На самом деле будет больше двух, которых нужно будет заполнить ...
 – 
HPWD
24 Сен 2017 в 22:18