利用jQuery實現多個ajax請求等待

前言

一般,jQuery的函數ajax進行Ajax調用。函數ajax只能作一個Ajax調用。當Ajax調用成功時,執行回調函數。可選地,當Ajax調用返回錯誤時,調用另外一個回調函數。可是,該功能不能根據這些請求的結果進行多個Ajax請求和註冊回調函數。一種狀況是,網頁使多個Ajax請求在禁用用戶交互時收集頁面不一樣部分的數據。該頁面僅在頁面獲取全部數據以後才能進行用戶交互。本文介紹了jQuery提供的一種基於多個Ajax請求來註冊回調函數的方法。這種方法是基於Deferred對象的概念。javascript

相關代碼

首先,在後臺的兩個ASP.NET Web API函數來接受服務器Ajax調用。代碼以下:前端

利用jQuery實現多個ajax請求等待

後臺接收ajax請求代碼
java

要進行單個Ajax調用,可使用jQuery的ajax函數。正面是一個簡單的例子:web

利用jQuery實現多個ajax請求等待

ajax調用示例ajax

成功和錯誤的回調函數正在等待單個Ajax調用。jQuery庫提供了一種方法來使任何回調函數等待多個Ajax調用。此方法基於稱爲Deferred的對象。Deferred對象能夠根據Deferrred對象是否解決或拒絕來註冊回調函數。如下是Deferred的示例。利用jQuery實現多個ajax請求等待promise

Deferred示例服務器

注意Deferred對象能夠連接。如下是Deferred對象鏈的示例。微信

利用jQuery實現多個ajax請求等待

Deferred對象有一個方法叫作promise。它返回一個Promise對象。Promise對象暴露了Deferred方法的一個子集,以防止其狀態被更改。這意味着防止Deferred對象被手動解析或拒絕。Promise對象公開如下Deferred方法:then,done,fail,always,pipe,progress,state,和 promise。它不會公開如下Deferred方法:resolve,reject,notify,resolveWith,rejectWith 和 notifyWith。promise對象能夠被視爲一個Deferred對象,該對象沒法手動更改該狀態。jQuery 的ajax函數返回一個jqXHR對象。這個jqXHR對象有兩個重要的事實。閉包

首先,一個jqXHR對象是XMLHTTPRequest對象的超集。例如,一個jqXHR對象能夠經過引用它的readyState屬性來查詢XMLHTTPRequest的狀態。若是其readyState爲4,則Ajax請求完成。函數

其次,一個jqXHR對象實現了Promise接口,並公開了全部的Promise方法。基本上,一個jqXHR 對象能夠被看成一個Promise對象。例如,done方法能夠用做jqXHR對象的成功回調函數。jQuery庫提供了一個被稱爲when的函數,接受多個Deferred對象並返回一個Promise對象的函數。當全部Deferred對象被解析時,返回的Promise對象將被解析。當任何Deferred對象被拒絕時,它將被拒絕。傳遞給函數的Deferred對象when能夠是Deferred對象,Promise對象或jqXHR對象。如下是等待多個Ajax請求的代碼示例:

利用jQuery實現多個ajax請求等待

首先,兩個變量存儲從兩個jQuery Ajax調用返回的jqXHR對象。而後將兩個對象傳遞給函數when。返回的Promise對象when被連接到函數then。函數then爲Promise對象添加了處理程序。then函數的第一個參數是一個成功函數,當Promise成功時調用它。then函數的第二個參數是在Promise被拒絕時調用的失敗函數。失敗函數檢查每一個Ajax調用的狀態。若是Ajax調用未完成,它將停止。注意,因爲頁面已執行和關閉,失敗函數仍然能夠訪問超出範圍的變量j1和j2 。這是由於JavaScript關閉。閉包是內部函數,即便外部函數關閉,也能夠訪問外部函數中的變量。換句話說,內部函數能夠保持首先定義的環境。

 

web前端/H5/javascript學習羣:250777811
歡迎你們關注個人微信號公衆號,公衆號名稱:web前端EDU。掃下面的二維碼或者收藏下面的二維碼關注吧(長按下面的二維碼圖片、並選擇識別圖中的二維碼)

 

相關文章
相關標籤/搜索