Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/408.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 检查函数是否为jQuery ajax请求_Javascript_Jquery_Ajax - Fatal编程技术网

Javascript 检查函数是否为jQuery ajax请求

Javascript 检查函数是否为jQuery ajax请求,javascript,jquery,ajax,Javascript,Jquery,Ajax,我正在编写一个ajax队列,我希望确保函数类型(在对象中)实际上是一个ajax请求,以便始终可以对其调用.done/.fail/。我该怎么做 我想确保函数的类型(在对象中)实际上是一个ajax请求,这样就可以对它调用.done/.fail/.always jQuery ajax请求对象(jqXHR)不是函数。在jQueryV1.12.0(我方便检查的版本)中,它们是添加了属性的普通对象(例如,没有特殊构造函数),因此您不能使用instanceof来查看它们是否是jqXHR对象 您可以测试获得的对

我正在编写一个ajax队列,我希望确保函数类型(在对象中)实际上是一个ajax请求,以便始终可以对其调用.done/.fail/。我该怎么做

我想确保函数的类型(在对象中)实际上是一个ajax请求,这样就可以对它调用.done/.fail/.always

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

您可以测试获得的对象上是否存在
完成
失败
、和/或
始终

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
等等。

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

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

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

这将适用于任何承诺(也是A+),具体检查jQuery ajax调用始终具有的
fail
done
always
方法,请参见T.J的答案。

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

或者,使用,应在完成的
$.ajax()请求时调用

调用所有
ajaxComplete
处理程序,而不管Ajax是什么 请求已完成。如果必须区分请求, 使用传递给处理程序的参数。每次
ajaxComplete
处理程序被执行,它被传递给事件对象
XMLHttpRequest
对象,以及 创建请求

我以前用过这个:

if(data && $.isFunction(data.promise)) {
...
}
我想确保函数的类型(在对象中出现)在 事实上,ajax请求总是可以调用.done/.fail/

从文件中:

从jQuery 1.5开始,$.ajax()返回的jqXHR对象实现 Promise接口,为它们提供所有属性、方法和 承诺的行为(有关更多信息,请参阅延迟对象)

jqXHR对象的可用方法包括:

jqXHR.done(函数(数据、文本状态、jqXHR){})替代方案 构造成功回调选项,.done()方法替换 已弃用的jqXHR.success()方法。有关详细信息,请参阅deferred.done() 实施细节

jqXHR.fail(函数(jqXHR,textStatus,errorshown){})An 错误回调选项的替代构造.fail()方法 替换已弃用的.error()方法。有关详细信息,请参阅deferred.fail() 实施细节

jqXHR.always(函数(数据| jqXHR、文本状态、jqXHR |错误抛出){ });*完整回调选项的替代构造 .always()方法替换不推荐使用的.complete()方法

相关问题/答案:


  • 老问题,但我认为所有这些答案都很不令人满意。 如果将来有人真的想检查传递的对象是否是承诺,请尝试此函数

    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 Promissions、Bluebird和jQuery ajax配合使用。

    可以包含有疑问的
    js
    ?您是否期望值与jQuery Promissions不同?对象可以有
    然后是
    属性,但不是
    $.ajax()
    请求。“我想确保函数的类型(来自对象)实际上是一个ajax请求”如果它在jQuery中有一个
    then
    方法,它是一个“thenable”延迟/承诺,并且即使不是ajax调用,它也有通常的回调。
    .done
    .fail
    始终都是延迟api的一部分,因此它也不限于ajax请求。问题似乎是要确定返回的对象是否是
    $.ajax()
    请求,而不仅仅是
    然后
    属性?请参见“我想确保函数类型(在对象中)实际上是一个ajax请求”的OP,如果它仅限于ajax,可以按照上面T.J.的说明进行操作。检查ajax调用只有的特定属性,如
    setRequestHeader
    等。@adeneo
    //做其他事情
    ;对于既没有显式满足也没有被拒绝的对象,可以使用
    $.when(obj).always()
    at
    else
    语句
    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;
    }