2012-07-12 45 views
42

從jQuery 1.8起,使用async:falsejQuery.ajax()已棄用
但是,在背景中存在正在進行的AJAX通信的情況下,您看到了多少個帶有「加載屏幕」的網頁?我可能看過數以千計的人。jQuery.ajax()方法的異步選項已被棄用,現在是什麼?

我的情況是,我正在編寫一個需要加載語言文件的移動應用程序。在開始時我加載語言文件,並從語言文件中檢索按鈕和其他GUI元素的文本。

這對我來說真的很糟糕。因爲如果語言文件丟失,GUI不應該出現。那麼我該如何解決它?把我所有的代碼放在success回調中?這對我來說似乎不是一個好的編程習慣。我能以另一種方式解決嗎?

+0

您可以創建新功能。並在onSuccess處理程序中調用這些函數。它仍然是可見的 – Sllix 2012-07-12 08:42:33

+0

是不是同步已被棄用? – 2012-07-12 08:42:59

+2

@ChenKinnrot'async = false'是'sync;) – 2012-07-12 08:44:45

回答

26

解決方案是手動添加疊加層以防止用戶與界面進行交互,然後在完成AJAX查詢後將其刪除。

$(function() { 
    show_overlay();   

    $.ajax({ 
     // Query to server 
    }).done(function() { 
     // Verify good data 
     // Do stuff 
     remove_overlay(); 
    }); 
}); 
+0

是的....我傾向於做那樣的事情。 Thx爲您的答案。 – Juw 2012-07-12 14:06:12

+1

你能解釋我應該如何手動添加和刪除覆蓋? show_overlay()不是一個函數。對不起,如果這個問題太小白菜,但我是新的。 – 2017-05-28 07:29:38

+1

@RobertoSepúlvedaBravo這只是一個例子。 'show_overlay()'是一個假設的函數,它顯示一個模糊界面的元素,就像一個div,它填充了帶有一些內容的z-index高的視口。 – jurgemaister 2017-05-30 22:27:55

0

你爲什麼要用ajax來獲取這個文件?只需使用script標籤即可。

在任何情況下,您都不會將所有代碼放在onSuccess中,而是從那裏調用一個可以啓動代碼的單個函數。

2

我敢打賭,頁那些1000年代許多實際上並不阻止用戶界面,同時等待AJAX​​調用。相反,他們可能會在進行調用時用等待屏幕遮住用戶界面,然後在響應處理程序中刪除它。

有很多方法來遮蔽用戶界面(你甚至可以使用設置爲Modal的jQuery UI對話框,並且沒有退出或關閉按鈕),所以我會把這個決定留給你。但是,代碼的佈局將是這樣的:

var someFunction = function() { 

    // any pre-conditions to the logic 
    // obscure the UI here 

    $.ajax({ 
     url: 'ajax/test.html', 
     success: function(data) { 

      // handle the response 
      // show the UI again 

     }, 
     error: function(data) { 

      // handle the response 
      // show the UI again 

     } 
    }); 
} 

我敢肯定,有多種方式來實現事件的順序,但這是一般的想法。阻止用戶界面從來沒有真正的意圖,我想這是一個更困難的決定jQuery到包括該功能比它要刪除它。它意味着異步。

+0

但是,如果你真的想阻止用戶界面使用blockUI插件:http://jquery.malsup.com/block/ – Simon 2012-07-12 08:50:41

+0

@Simon:當然,如果你真的想。但不建議,通常情況下,這表明需要重新考慮自己的方法。可能有例外,但我現在想不出任何情況。 – David 2012-07-12 08:52:05

+0

Thx David爲您解答! – Juw 2012-07-12 14:06:47

27

我在這個參數的折舊票讀取official discussion,這裏是我的理解:

  • 的問題是,對於同步AJAX實現Promise S(1)給他們的開銷。

  • 有許多現實世界的同步AJAX使用情況,例如,在頁面卸載之前保持狀態。因此,此功能將保留,但您使用它的方式可能會更改。

  • asyncfalse時,最接近的解決方案(登陸1.8?)僅支持回調(但不包括Promises)。

總之:繼續使用async: false如果你有,但它的缺點(阻塞的VM)的提防。不用擔心,如果此功能從$.ajax()中刪除,則會提供替代方案。

+0

「頁面卸載前保存狀態」是什麼意思?我想不出一個同步AJAX的好用。 – user2867288 2015-03-26 15:15:27

+3

@ user2867288,頁面卸載是一個事件,當用戶嘗試關閉瀏覽器選項卡/窗口時發生。 「保持狀態」可能意味着很多事情:自動保存表單數據,告訴服務器用戶交互已完成,提交一些分析數據(例如用戶花費在頁面上的時間)。這確實有一個用例 - 這就是爲什麼創建[Beacon API](https://developer.mozilla.org/en-US/docs/Web/API/Navigator/sendBeacon)的原因。當它具有適當的交叉瀏覽器支持時,並不需要太多的同步AJAX。 – Infeligo 2015-03-26 19:39:17

相關問題