Могу ли я получить jQuery Deferred на document.ready()?
Сразу после загрузки script я делаю запрос Ajax для получения некоторых переводов. Это должно всегда возвращаться после того, как документ будет готов, так как я загружаю свои скрипты в нижней части страницы, но мне все же интересно, можно ли получить Отложенный объект в состоянии готовности документа.
Таким образом, можно было бы убедиться, что оба документа готовы и вызов Ajax успешно вернулся, прежде чем делать что-либо еще, например. например:
$.when( $.ajax('translations'), document.ready())
.then(function(){
// Start doing stuff here
});
Ответы
Ответ 1
Вы можете связать отложенный объект с документом с помощью данных() и resolve() it в вашем обработчике ready
. Таким образом, вы можете использовать сохраненный отложенный объект с $. When():
$(document).data("readyDeferred", $.Deferred()).ready(function() {
$(document).data("readyDeferred").resolve();
});
$.when($.ajax("translations"), $(document).data("readyDeferred"))
.then(function() {
// Start doing stuff here.
});
Ответ 2
Здесь очищенная версия комментария ircmaxell:
(function() {
var doc_ready = $.Deferred();
$(doc_ready.resolve);
$.when(doc_ready, $.ajax('translations')).then(function() {
console.log("done");
});
})();
изменить
Некоторые пояснения, чтобы остановить неправильные изменения:
Передача функции объекту jquery (например, $(some_func)
) совпадает с $(document).ready(some_func)
.
Следовательно, строка $(doc_ready.resolve);
является просто сокращенной для чего-то вроде этого:
$(document).ready(function() {
doc_ready.resolve()
});
Ответ 3
Попробуйте следующее:
$.when($.ajax('translations'), $.ready).then(function() {
// Start doing stuff here
});
Ответ 4
Моя версия:
$.when(
$.Deferred(function() { $(this.resolve); }),
$.ajax('translations')).
then(function() { console.log("done"); });
Ответ 5
Обновление для справки (2015):
Это доступно в текущих версиях jQuery:
$.when($.ready).then(...);
Также легко преобразовать в поток, используя highlandjs:
_($.when($.ready)).map(transform).pipe(output) // etc.
Ответ 6
jQuery when
не является надлежащим обещанием. Вы можете заставить это сделать так:
function documentReady() {
return Promise.resolve($.when($.ready));
}
Использование:
documentReady().then(function($) { ... });
Это происходит с помощью $
, поэтому это тоже удобно.
Альтернативная реализация:
function documentReady() {
return new Promise(r => $(r));
}