2011-05-30 102 views
20

我的腳本加載後,我正在做一個Ajax請求來獲得一些翻譯。這應該總是在文檔準備就緒後返回,因爲我將腳本加載到頁面的底部,但我仍然很好奇在文檔就緒狀態下是否可以獲得Deferred Object我可以得到一個延遲document.ready()的jQuery?

通過這種方式,可以確保文檔已準備就緒,並且在做其他事情之前成功返回Ajax調用,例如,像這樣:

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

回答

22

可以延期對象使用data()文檔resolve()它在你ready處理程序相關聯,和。這樣一來,你應該能夠使用存儲的延遲對象與$.when()

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

$.when($.ajax("translations"), $(document).data("readyDeferred")) 
.then(function() { 
    // Start doing stuff here. 
}); 
+0

感謝,簡單明瞭。這可能也適用於全局變量或類似的東西。 – Daff 2011-05-30 15:24:59

+1

@Daff,絕對。我個人更喜歡使用'data()'而不是全局變量,因爲它更靈活,避免污染全局名稱空間。 – 2011-05-30 15:34:36

+6

迂腐的筆記。根本沒有理由存儲變量。在設置階段你只需要它,所以使用閉包範圍:'(function(){var deferred = new $ .Deferred(); $(function(){deferred.resolve();}); $ .when($。 ajax('foo'),deferred).then(function(){});})();'...如果您使用本地範圍,則無需存儲,只需讓閉包爲您綁定即可。 – ircmaxell 2012-03-26 14:16:36

18

這裏的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() 
}); 
6

我的版本是:

$.when(
    $.Deferred(function() { $(this.resolve); }), 
    $.ajax('translations')). 
    then(function() { console.log("done"); }); 
+1

我喜歡包含延期的方式。 一個建議是改變你的延期順序,這樣你的回調函數的第一個參數就是解析了延期的$ .ajax的任何值。 – Asaf 2013-06-02 14:25:35

9

試試這個:

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

是否記錄在案? – Eric 2013-10-30 20:05:06

+3

請注意,'$ .ready'實際上並不是延遲的,而是恰好有一個'promise'方法。 – Eric 2013-10-30 20:18:38

+1

不,它還沒有被記錄:https://github.com/jquery/api.jquery.com/issues/205 – thorn 2013-11-02 11:57:06

2

更新引用( 2015):

這是jQuery中的當前版本:

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

這也是簡單轉換爲使用highlandjs流:

_($.when($.ready)).map(transform).pipe(output) // etc. 
+0

正如前面提到的那樣,它沒有被記錄爲$ .ready是一個延遲的對象。這在2016年仍然沒有記錄。 – 2016-02-02 13:14:34

0

jQuery的when不是一個適當的承諾。你可以迫使它變成一個這樣的:

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

用法:

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

它發生與$解決所以這是一種方便了。

替代實現:

function documentReady() { 
    return new Promise(r => $(r)); 
}