检查函数是否是jQuery ajax请求

时间:2016-02-01 15:55:23

标签: javascript jquery ajax

我正在编写一个ajax队列,我想确保函数类型(在一个对象中)实际上是一个ajax请求,以便可以在其上调用.done / .fail / .always。我怎么能这样做?

5 个答案:

答案 0 :(得分:4)

  

我想确保函数类型(来自对象)实际上是一个ajax请求,以便可以在其上调用.done / .fail / .always。

jQuery ajax请求对象(jqXHR)不是函数。在jQuery v1.12.0(我方便检查的版本)中,它们是添加了属性的普通对象(例如,没有特殊构造函数),因此您无法使用instanceof来查看它们是否{{1} 1}}对象。

您可以测试您获得的对象上是否存在jqXHRdone和/或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等等。

答案 1 :(得分:2)

我以前用过这个:

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. Any way to check whether a variable is a real jqXHR?
  2. How can I tell if an object is a jQuery Promise/Deferred?

答案 2 :(得分:1)

检查某些东西是否是承诺,或者在jQuery的情况下,延迟,可以通过检查对象" thenable" 来完成,即它有一个then()方法

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

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

这适用于任何promises(也是A +),专门检查jQuery ajax调用总是会有faildonealways方法,参见T.J&回答。

答案 3 :(得分:1)

尝试检查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
})

答案 4 :(得分:0)

老问题,但我认为所有这些答案都非常不满意。 如果将来有人真的想检查传递的对象是否是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。