[英]Check if function is jQuery ajax request
我正在寫一個ajax隊列,我想確保函數類型(在一個對象中)實際上是一個ajax請求,以便可以在其上調用.done / .fail / .always。 我怎樣才能做到這一點?
我想確保函數類型(來自對象)實際上是一個ajax請求,以便可以在其上調用.done / .fail / .always。
jQuery ajax請求對象( jqXHR
)不是函數。 在jQuery v1.12.0(我方便檢查的版本)中,它們是添加了屬性的普通對象(例如,沒有特殊的構造函數),所以你不能使用instanceof
來查看它們是否是jqXHR
對象。
您可以測試done
, fail
和/或always
存在於您獲得的對象上:
if (obj.done && obj.fail && obj.always) {
// It's probably a jqXHR
}
或者如果你想要更徹底,你可以確保它們是功能:
if (typeof obj.done == "function" &&
typeof obj.fail == "function" &&
typeof obj.always == "function") {
// It's probably a jqXHR
}
這是“鴨子打字”的一個例子:它像鴨子一樣嘎嘎叫,所以我們假設它是一只鴨子。
如果你想盡可能多地限制它到jqXHR
對象而不是其他具有這些功能的東西,你可以檢查它們擁有的其他功能/屬性,例如getAllResponseHeaders
等。
我之前用過這個:
if(data && $.isFunction(data.promise)) {
...
}
我想確保函數類型(來自對象)實際上是一個ajax請求,以便可以在其上調用.done / .fail / .always。
從jQuery.ajax()文檔:
自jQuery 1.5起,$ .ajax()返回的jqXHR對象實現了Promise接口,為它們提供了Promise的所有屬性,方法和行為(有關更多信息,請參閱Deferred對象)。
jqXHR對象的可用Promise方法包括:
jqXHR.done(function(data,textStatus,jqXHR){}); 成功回調選項的替代構造,.done()方法替換了不推薦使用的jqXHR.success()方法。 有關實現的詳細信息,請參閱deferred.done()。
jqXHR.fail(function(jqXHR,textStatus,errorThrown){}); 作為錯誤回調選項的替代構造,.fail()方法替換了不推薦使用的.error()方法。 有關實現的詳細信息,請參閱deferred.fail()。
jqXHR.always(function(data | jqXHR,textStatus,jqXHR | errorThrown){}); *完整回調選項的替代構造,.always()方法替換了不推薦使用的.complete()方法。
相關問題/答案:
檢查某些東西是否是一個承諾,或者在jQuery的情況下是一個Deferred,可以通過檢查該對象是“可以”來完成,即它有一個then()
方法
var xhr = $.ajax({url:'...'});
if (typeof xhr === 'object' && typeof xhr.then === 'function') ...
這將適用於任何promises(也是A +),專門檢查jQuery ajax調用總是會有fail
, done
和always
方法,請參閱TJ的答案。
嘗試檢查status
屬性,調用.state()
函數
if (object.status && (obj.state() === "resolved" || obj.state() === "rejected")) {
if (obj.status === 200) obj.done(success)
else obj.fail(err)
} else {
// do other stuff
}
或者,使用.ajaxComplete()
,它應該在完成的$.ajax()
請求中調用
無論Ajax請求完成了什么,都會調用所有
ajaxComplete
處理程序。 如果必須區分請求,請使用傳遞給處理程序的參數。 每次執行ajaxComplete
處理程序時,都會傳遞事件對象,XMLHttpRequest
對象以及在創建請求時使用的設置對象。
$(document).on("ajaxComplete", function(event, xhr, settings) {
// do stuff
})
老問題,但我認為所有這些答案都非常不滿意。 如果將來有人真的想檢查傳遞的對象是否是Promise,請嘗試此函數。
function isPromise (obj) {
const normal = !!obj && typeof obj === 'object' &&
((obj.constructor && obj.constructor.name === 'Promise') || typeof obj.then === 'function');
const fnForm = !!obj && (typeof obj === 'function') &&
((obj.name === 'Promise') || (typeof obj.resolve === 'function') && (typeof obj.reject === 'function'));
return normal || fnForm;
}
適用於ES6承諾,Bluebird和jQuery ajax。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.