2016-01-12 2 views
-1

Хорошо, вот проблема, с которой я борюсь. У меня есть этот код (simplyfied):Функция jQuery ajax .done() срабатывает слишком рано?

var initializeZasilkovna = function() { 
 
    // Initialize object 
 
    window.packetery.initialize(); 
 
}; 
 

 
// Check if the object doesnt exist 
 
if (!window.packetery) { 
 
    // It doesnt exists. Download it. 
 
    $.ajax({ 
 
    url: document.location.protocol + "//www.zasilkovna.cz/api/v2/4854erws856w4efs/branch.js", 
 
    dataType: "script", 
 
    cache: true 
 
    }).done(function() { 
 
    // After download is complete initialize it. 
 
    initializeZasilkovna(); 
 
    }); 
 
} else { 
 
    // It exists only initialize it. 
 
    initializeZasilkovna(); 
 
}

Это заканчивается с "window.packetery" ошибки не определен.

Дело в том, что я хочу загрузить удаленный скрипт на какое-то событие, потому что он слишком велик. После его загрузки я хочу вызвать функцию, которая ее инициализирует.

Проблема заключается в том, что функция .done() не дожидалась полной загрузки сценария и слишком рано запускает инициализацию. Ожидается ли функция .done()? Когда я добавляю setTimeout, он работает правильно. Что может быть неправильным парнем?

Самое забавное, что у меня есть один и тот же код на интерфейсе и работает правильно. Я не понял, что не так. Любые советы приветствуются. Спасибо!

+2

'$ .getScript()'? –

+1

создать проверку setInterval, которая неоднократно проверяет, чтобы она существовала, один раз, скажем, через 100 мс после завершения запроса ajax. очистите интервал, как только он будет доступен. Не самое чистое решение, но оно работает каждый раз в каждом браузере. –

+0

@KevinB, нет, это не работает, если соединение (мобильное) или веб-сайт работает медленно. – FeedTheWeb

ответ

2

Как вы можете видеть in the documentation (эм шахты):

Успех Обр

обратного вызова вызывается после того, как скрипт был загружен, но не обязательно выполнен.

AFAIK нет никакого способа гарантии, что сценарий был выполнен, кроме добавления вашего обратного вызова самого скрипта.

Общим обходным решением является использование setTimeout(initializeZasilkovna, 0), хотя даже это не является надежным на 100%, это зависит от механизма JS браузера, чтобы почитать его.

+0

Этот акцент действительно * должен * быть в исходном документе. Рад, что вы поймали эту маленькую линию, похожую на половину страницы, она полностью меняет ожидаемое поведение функции. –

-1

Вы можете передать success, который содержит функцию обратного вызова

$.ajax({ 
    url:... 
    .... 
    success: function(res){ 
     //callback 
    } 
}); 
Смежные вопросы