Подтвердить что ты не робот

Могу ли я получить jQuery Deferred на document.ready()?

Сразу после загрузки script я делаю запрос Ajax для получения некоторых переводов. Это должно всегда возвращаться после того, как документ будет готов, так как я загружаю свои скрипты в нижней части страницы, но мне все же интересно, можно ли получить Отложенный объект в состоянии готовности документа.

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

$.when( $.ajax('translations'), document.ready())
.then(function(){
    // Start doing stuff here
});
4b9b3361

Ответ 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));
}