25

スクリプトがロードされた直後に、いくつかの翻訳を取得するためにAjaxリクエストを行っています。ページの下部にスクリプトをロードしているので、ドキュメントの準備ができた後は常にこれが返されるはずですが、ドキュメントの準備ができた状態で遅延オブジェクトを取得できるかどうかはまだ気になります。

そうすれば、ドキュメントの準備ができており、Ajax呼び出しが正常に返されることを確認してから、次のようにすることができます。

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

6 に答える 6

24

data()を使用して遅延オブジェクトをドキュメントに関連付け、ハンドラーでそれをresolve()することができます。このようにして、保存された遅延オブジェクトを$ .when()readyで使用できるようになります。

$(document).data("readyDeferred", $.Deferred()).ready(function() {
    $(document).data("readyDeferred").resolve();
});

$.when($.ajax("translations"), $(document).data("readyDeferred"))
 .then(function() {
    // Start doing stuff here.
});
于 2011-05-30T14:26:20.953 に答える
20

これは、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()
});
于 2012-04-26T02:23:07.007 に答える
9

これを試して:

$.when($.ajax('translations'), $.ready).then(function() {
    // Start doing stuff here
});
于 2013-06-11T13:23:53.390 に答える
6

私のバージョンは:

$.when(
  $.Deferred(function() { $(this.resolve); }), 
  $.ajax('translations')).
  then(function() { console.log("done"); });
于 2013-02-19T09:57:49.377 に答える
2

参考のための更新(2015):

これは、jQueryの現在のバージョンで利用できます。

$.when($.ready).then(...);

highlandjsを使用してストリームに変換することも簡単です。

_($.when($.ready)).map(transform).pipe(output) // etc.
于 2015-12-19T18:35:57.840 に答える
0

jQuerywhenは適切な約束ではありません。あなたはそれを次のように強制することができます:

function documentReady() {
    return Promise.resolve($.when($.ready));
}

使用法:

documentReady().then(function($) { ... });

たまたま解決する$ので、それも便利です。

代替実装:

function documentReady() {
    return new Promise(r => $(r));
}
于 2016-05-12T16:29:24.153 に答える