2014-01-17 4 views
12

getScript docs говорит об обратном вызове успеха, что:JQuery getScript нагрузка против исполнения

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

Но в моем тестировании это не похоже на правду. На странице хоста с:

var startTime = new Date(); 

$.getScript("test.js") 
.done(function(script, textStatus) { 
    console.log(textStatus); 
    console.log("Done callback executing now.") 
    }) 
    .fail(function(jqxhr, settings, exception) { 
    console.log("error."); 
}); 

загрузки следующий «test.js» сценарий, который связывает пользовательский интерфейс в течение 5 секунд:

console.log("ajaxed script starting to execute."); 
var newTime = new Date(); 
while (newTime - startTime < 5000) { 
    newTime = new Date(); 
} 
console.log("elapsed time", newTime - startTime); 
console.log("ajaxed script finished executing."); 

приводит к той же предсказуемой консоли вывода в обоих FF & Chrome :

ajaxed script starting to execute. 
elapsed time 5000 
ajaxed script finished executing. 
success 
Done callback executing now. 

другими словами, обратный вызов не всегда срабатывает до тех пор, загружаемый скрипт не как загружается и выполняется. Это, кажется, потому что в JQuery source, функция globalEval немедленно вызове сценария:

converters: { 
    "text script": function(text) { 
     jQuery.globalEval(text); 
     return text; 
    } 
} 

Таковы документы неправильно? Если они верны, то в каких конкретных случаях будет успешным обратный вызов до сценарий выполнен?

+0

Можете ли вы взять свой вопрос и уценку на https://github.com/jquery/api.jquery.com/issues? :) – gnarf

+0

Документация определенно неверна, спасибо за головы :) –

+1

Спасибо, github issue filed: https://github.com/jquery/api.jquery.com/issues/420 – Ben

ответ

0

Из того, что я могу сказать, глядя на источник, я согласен с заключением, что обещание должно всегда решительность после скрипт выполняется.

Однако моя память говорит мне, что была какая-то странность в том, что вы вводили теги <script> в одном из многочисленных браузеров. Поддержка jQuery 1.x (s|ed). Браузер проблем запускал загруженные обратные вызовы до того, как скрипт был выполнен в какой-то момент, или мы не добавили бы примечания об этом в документы.

Я уверен, что реализация $.getScript изменилась с тех пор, и проблема в документах больше не актуальна, так как нам нужно задать вопрос перед основной командой jQuery. Вы действительно должны открыть проблему на github - не стесняйтесь cc @gnarf.

0

Это цитата из ответа на GitHub issue поданном оригинальном плакат:

$.getScript("https://platform.twitter.com/widgets.js").done(..) с некоторыми щебетом СМИ будет стрелять сделать код, не дожидаясь выполнения произойдут.

Таким образом, документация представляется правильной, хотя, возможно, не такой наглядной, как хотелось бы.

+0

Хммм ... Я хотел бы видеть этот код. Я сильно подозреваю, что у виджета Twitter есть тайм-аут или какое-то асинхронное поведение. Другими словами, сценарий был выполнен, и любой последующий связанный код происходит в цикле событий. Это означает, что обратный вызов успеха может срабатывать до завершения какого-либо вторичного действия. – Ben

0

Я столкнулся с этой проблемой в версии 1.1.1 jQuery. Перед версией 2.1.0 функция $.globalEval() использовала косвенный вызов печально известного eval() для запуска кода в глобальной среде.

Так что это, безусловно, было проблемой раньше.

В версии 2.1.0 они переключились на вставку скрипта из-за определенных недостатков в косвенном вызове eval. Вы можете найти больше информации, если хотите.

http://perfectionkills.com/global-eval-what-are-the-options/

В новой реализации с вставкой сценария эта линия делает волшебную

context.head.appendChild(script).parentNode.removeChild(script); 

Если нет какой-то странный базовый механизм браузера, кажется, сценарий должен быть выполнено немедленно, прежде чем будет удален из Дерево DOM.

Смежные вопросы