2013-08-16 24 views
6

我對$ .ajax()使用async:false選項感到困惑。根據$ .ajax()文檔:

從jQuery 1.8開始,不贊成使用帶有jqXHR($ .Deferred)的async:false; 必須使用成功/錯誤/完整回調選項,而不是jqXHR對象的相應 方法,例如jqXHR.done()或不贊成使用的jqXHR.success()。

我不知道jqXHR($ .Deferred)是什麼意思。由於任何原因使用async:false折舊,或者是jqXHR($ .Deferred)某種特殊用例?

我問,因爲我有收到一個$就麻煩了()調用發生asynchronously.This是使用jQuery 1.8.2:

var ret = {}; 

$.ajax({ 
    async:   false, 
    method:   'GET', 
    contentType: 'application/json', 
    dataType:  'jsonp', 
    url:   '/couchDBserver', 
    error:   myerr, 
    success:  function(data) { 

     var rows = data.rows; 

     //something that takes a long time 
     for(var row in rows) { 
      ret[rows[row].key] = rows[row].value; 
     } 

     console.log('tick'); 
    } 
}); 
console.log('tock'); 
console.log(JSON.stringify(ret)) 

我的控制檯輸出爲:

滴答
{}

難道我做錯了什麼,還是我DOI ng something wrong

+0

我會在'success'函數中放入'tock'代碼和其他所有需要在ajax請求之後運行的代碼。異步AJAX有點馬虎。 – MattDiamant

+0

我想不可能創建同步的'JSONP'請求,因爲它根本不是'AJAX'。我看到你從相同的來源加載數據,有任何使用'JSONP'的理由? – Tommi

+0

我明白這一點,這是我過去試圖避免的。但是,我經常會得到spagetti代碼,這本質上是試圖發出同步請求。有時你需要做出重新評估,評估結果,然後根據你的評估提出另一個請求(無限期)。有什麼我沒有得到有關$ .ajax(),使同步請求一個*壞事*?在這些情況下,我應該使用不同的庫來進行「GET」,「POST」和「PUT」請求嗎? – ddouglascarr

回答

3

您試圖在同一時間使用帶有async:false的JSONP技術。這不可能。JSONP實際上是創建script元素並將其附加到文檔的某個位置,因此它不是XHR,並且jQuery無法將同步標誌傳遞到任何位置。因爲你從同一來源的數據,只是改變數據類型來

dataType:  'json', 

但是,每個人都可以告訴你,同步請求並不好,他們掛您的瀏覽器。你只能在少數情況下使用它們。

10

它是什麼是說,如果你的要求是async: false那麼你不應該使用ajax.done()ajax.fail()等方法來註冊回調方法,而不是你需要通過使用success/error/complete選項Ajax調用

回調方法正確

$.ajax({ 
    async: false, 
    success: function(){ 
    }, 
    error: function(){ 
    }, 
    complete: function(){ 
    } 
}) 

錯誤

$.ajax({ 
    async: false 
}).done(function(){ 
}).fail(function(){ 
}).always(function(){ 
}) 

如果異步:真//沒有指定

正確

$.ajax({ 
}).done(function(){ 
}).fail(function(){ 
}).always(function(){ 
}) 

$.ajax({ 
    async: false, 
    success: function(){ 
    }, 
    error: function(){ 
    }, 
    complete: function(){ 
    } 
}) 
3

Deferred對象的jQuery負責處理AJAX promises。事實上,async: false將徹底打破您需要處理承諾的異步調用的概念。

jQuery doc片斷告訴你什麼是這樣的事情將被禁止。

$.ajax({ 
    async: false, 
    /*rest of the options*/ 
}).done(function(){ 
    //do something after the response comes back successfully 
}); 

然而,連接呼選項是完全有效的,並且是使用AJAX與async: false的唯一途徑。

$.ajax({ 
    async: false, 
    /*Rest of the options*/ 
    success: function(){ 
       console.log("foo"); 
      } 
}); 
相關問題