簡體   English   中英

檢查函數是否是jQuery ajax請求

[英]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對象。

您可以測試donefail和/或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()方法。

相關問題/答案:

  1. 有什么方法可以檢查變量是否是真正的jqXHR?
  2. 如何判斷對象是否為jQuery Promise / Deferred?

檢查某些東西是否是一個承諾,或者在jQuery的情況下是一個Deferred,可以通過檢查該對象是可以”來完成,即它有一個then()方法

var xhr = $.ajax({url:'...'});

if (typeof xhr === 'object' && typeof xhr.then === 'function') ...

這將適用於任何promises(也是A +),專門檢查jQuery ajax調用總是會有faildonealways方法,請參閱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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM