Jquery.getcript(), когда script полностью загружен и выполнен
Как и на странице jquery api
http://api.jquery.com/jQuery.getScript/
Успешный обратный вызов
Обратный вызов запускается после загрузки script, но не обязательно выполняется.
$.getScript("test.js", function() {
foo();
});
если функция foo()
зависит от test.js, она не может быть выполнена успешно.
Я видел подобную вещь с google map api, но в этом случае вы можете указать функцию обратного вызова в URL-адресе ajax script. Но в целом есть ли очевидный способ дождаться выполнения ajax script для выполнения обратного вызова?
Ответы
Ответ 1
Я знаю, что это старый вопрос, но я думаю, что оба ответа, содержащие "готово", не объясняются их владельцами, и на самом деле они являются лучшими ответами.
Ответы с наибольшим количеством голосов требуют использования "async: false", что, в свою очередь, создает вызов синхронизации, который не является оптимальным. с другой стороны, в jquery были введены обещания и обработчики обещаний начиная с версии 1.5 (может, раньше?), в этом случае мы пытаемся загрузить скрипт асинхронно и дождаться его завершения.
Обратный вызов по определению документации getScript
Обратный вызов запускается после загрузки скрипта, но не обязательно выполняется.
вместо этого нужно искать, как действуют обещания. В этом случае, когда вы ищете скрипт для асинхронной загрузки, вы можете использовать "затем" или "готово", взгляните на этот поток, который хорошо объясняет разницу.
В основном сделанное будет вызвано только тогда, когда обещание будет выполнено. в нашем случае, когда скрипт был успешно загружен и завершен. Так что в основном в вашем коде это будет означать:
$.getScript("test.js", function() {
foo();
});
следует изменить на:
$.getScript("test.js").done(function(script, textStatus) {
console.log("finished loading and running test.js. with a status of" + textStatus);
});
Ответ 2
Вы можете использовать ajax
jQuery.ajax({
async:false,
type:'GET',
url:script,
data:null,
success:callback,
dataType:'script'
});
Async является ложным, потому что вы хотите загрузить и выполнить script, после этого при успешном обратном вызове вы можете вызвать вашу функцию foo()
Ответ 3
$.getScript(...)
+ setInterval(...)
работал для меня:
$.getScript('https://www.google.com/recaptcha/api.js')
.done(function() {
var setIntervalID = setInterval(function() {
if (window.grecaptcha) {
clearInterval(setIntervalID);
console.log(window.grecaptcha);
letsWorkWithWindowDotGreptcha();
};
}, 300);
});
function letsWorkWithWindowDotGreptcha() {
// window.greptcha is available here....
}
Как только variable
мы ищем, определена (в моем случае window.grecaptcha
, я могу вызвать функцию closure function
которую можно abstracted out
.
Удачи...
Ответ 4
$.getScript( "ajaxFile/myjs.js" )
.done(function( s, Status ) {
console.warn( Status );
})
.fail(function( jqxhr, settings, exception ) {
console.warn( "Something went wrong"+exception );
});
Ответ 5
Я боюсь, что решение требует опроса для зависимости. В качестве альтернативы script необходимо обернуть в предопределенный обратный вызов, например AMD.
Ответ 6
Сегодня я столкнулся с той же проблемой и придумал решение на основе promises и таймер интервала:
$.getScript("test.js", function() {
var $def = $.Deferred();
if (typeof foo === 'undefined') { // "foo" isn't available
var attempts = 0;
// create an interval
// that will check each 100ms if the "foo" function
// was loaded
var interval = setInterval(function() {
if (typeof foo !== 'undefined') { // loaded
window.clearInterval(interval);
$def.resolve();
}
// after X unsuccessfull attempts, abort the operation
else if (attempts >= 100) {
window.clearInterval(interval);
$def.reject('Something went wrong');
}
attempts++;
}, 100);
}
else { // "foo" is available
$def.resolve();
}
return $def.promise();
}).then(function() {
// at this point "foo()" is definitely available.
}).fail(function() {
// deal with the failure
});
Идея заключается в том, что вы загружаете данный script, который будет выставлять некоторую переменную (функция foo
в вашем примере вопроса), которая все еще не существует, поэтому после того, как script загружается getScript
, вы проверьте, существует ли эта переменная, если вы не создаете интервал, который будет постоянно проверять, доступна ли эта переменная, и только когда это условие выполнено, вы разрешите обещание.
Ответ 7
$getScript, как это сделать
$.getScript( "js/jquery.raty.min.js" )
.done(function( script, textStatus ) {
console.log( textStatus );
}
});
это отлично работает для меня