Javascript 检查函数是否为jQuery ajax请求
我正在编写一个ajax队列,我希望确保函数类型(在对象中)实际上是一个ajax请求,以便始终可以对其调用.done/.fail/。我该怎么做 我想确保函数的类型(在对象中)实际上是一个ajax请求,这样就可以对它调用.done/.fail/.always 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对象 您可以测试获得的对
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()
atelse
语句
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;
}