2013-12-12 24 views
1

我正在使用jQuery,並在$(document).ready()函數中調用$.ajax()。但是,我意識到要做AJAX調用,我不使用DOM中的任何東西。此外,該Ajax調用可能需要第二個或兩個(或更多)服務器端。所以,出於這兩個原因,我希望儘快完成它,並且我正在考慮重構我的代碼,使其看起來像這樣(這將在HTML文件頂部附近的<script>塊中) :是否立即調用JQuery.ajax,但在document.ready之前不調用回調?

var someGlobal="whatever"; 
... 
function onReply(response){ 
    //Do something 
} 
... 
$.ajax({ 
    'url':"call_me.json", 
    'type':'POST', 
    'data':{x:someGlobal,y:"Dude!"} 
    }) 
    .fail(function(jqXHR,status){ 
    console.log("AJAX ERROR:" + status); 
    }) 
    .done(onReply); 
... 

然而,onReply()回調確實需要已建成的DOM(同上爲.fail()回調)。所以我不希望onReply$(document).ready()運行之前被調用。有沒有什麼內置jQuery,讓我保證將是這種情況?

P.S.使用jQuery 1.10.x

+0

非常類似的問題(一旦你想使用deferreds):http://stackoverflow.com/questions/6177187/can-i-get-a -jquery-deferred-on-document-ready(但沒有一個答案會考慮如果ajax調用失敗會發生什麼情況;它們也不會在頁面完全加載之前啓動ajax調用,並且我想立即啓動它。) –

回答

2

試試這個:

var flag = 0; 
function onReply(response){ 
    if (flag == 0) 
    { 
     $(document).ready(
      function() { 
       anotherfunction(response); 
      }); 
    } 
    else 
     anotherfunction(response); 
} 

$(document).ready(
    function() { 
     flag = 1; 
    } 
); 

function anotherfunction(resp) { 
    // Do something 
} 

更好的辦法(1.5年後):
而不是使用一個變量來跟蹤document的負載狀態,我們可以使用JavaScript的擁有document.readyState

function onReply(response){ 
    function ProcessResponse() { 
     // Do something with 'response' 
    } 
    document.readyState == 'complete' ? ProcessResponse() : $(ProcessResponse); 
} 
+0

如果document.ready在ajax響應之前觸發 – Ramesh

+0

@Ramesh:你的懷疑是絕對正確的。看到我已經更新了答案。 – P5Coder

+0

這段代碼是否包含競爭條件,或JavaScript方法是否從未中斷/被搶佔? – Zack

0

最近,我讀Learning jQuery Deferreds,我相信這是優雅的解決方案我一直在尋找,幾個月前,當我張貼了這個問題!

要使用它,我創建了一個全局的Deferred對象,它是當DOM準備就緒時的resolve() -ed。從那個Deferred對象中,我提取一個承諾,並且$.ajax()調用返回一個承諾。我不希望onReply()(或者ajax錯誤處理)在這兩個操作完成之前調用,或者在Deferred行話中,直到兩個promise均已解決。我們這樣做的方式是使用$.when(),其中承諾承諾(*)的列表等待,並返回另一個承諾對象,我們可以附加fail()done()處理程序。

*:從技術上講,它們不需要是承諾對象;它們也可以是正常的功能。

下面是該解決方案的第一稿:

var someGlobal = 'whatever'; 
var readyToInit = $.Deferred(); 
... 
function onReply(response){ 
    //Do something 
} 
... 
var ajaxPromise = $.ajax({ 
    'url':'call_me.json', 
    'type':'POST', 
    'data':{x:someGlobal,y:'Dude!'} 
    }); 

$.when(ajaxPromise, readyToInit.promise()) 
    .fail(function(jqXHR,status){ 
    console.log('AJAX ERROR:' + status); 
    }) 
    .done(onReply); 
... 
$(function() { //OnReady 
    readyToInit.resolve(); //Anything waiting for the page to load can go now 
}); 
相關問題