繁体   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