jquery ajax作為deferred對象如何觸發progress?
jQuery deferred對象存在三種狀態觸發函數,resolve,fail,notify,分別對象成功,失敗,進行中三種回調函數,當deferred不是promise對象的時候可以自行通過調用三個方法來觸發不同的狀態從而觸發相應的回調函數。但是jquery ajax就是一個promise對象,不能手動的觸發notify,查閱deferred的pipe方法,可以傳遞三個回調函數,對應上訴的三種狀態,但是,成功,失敗回調都是內部自行控制,外部不能干預,那是不是說,通過pipe的方式執行ajax是沒有機會執行progress方法的呢?有的話,如何控制?如果有需要在ajax執行中添加函數的需求,如何實現呢?
2018-07-16
2016-02-05
通過pipe的方式執行ajax是沒有機會執行progress方法的呢?
if?(?isSuccess?)?{ ???deferred.resolveWith(?callbackContext,?[?success,?statusText,?jqXHR?]?); }?else?{ ???deferred.rejectWith(?callbackContext,?[?jqXHR,?statusText,?error?]?); }很明顯,ajax并沒有調用notifyWith的地方。所以,不會有機會執行progress方法。
另外,對于XMLHttpRequest的事件而言。
onreadystatechange才能監聽傳輸中狀態,也就是觸發progress方法
而jQuery.ajax使用的是onload方法,onload只在ajax加載完成才會觸發。如下:
xhr.onload?=?callback(); xhr.onerror?=?callback("error");所以,如果想要觸發progress方法,需要再綁定一個事件:
xhr.onreadystatechange?=?function(){ ????if(xhr.readyState==3){ ????????//類似于jqXHR.notifyWidth(callbackContext); ????} }