我正在编写一个ajax队列,并且想要确保函数的类型(以对象形式提供)实际上是一个ajax请求,以便可以在其上调用.done/.fail/.always方法。我该如何做到这一点?
我正在编写一个ajax队列,并且想要确保函数的类型(以对象形式提供)实际上是一个ajax请求,以便可以在其上调用.done/.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
对象而不是其他具有这些函数的对象,可以检查它们是否有其它函数/属性,比如getAllResponseHeaders
等。if(data && $.isFunction(data.promise)) {
...
}
then()
方法。var xhr = $.ajax({url:'...'});
if (typeof xhr === 'object' && typeof xhr.then === 'function') ...
fail
、done
和always
方法,这些方法与jQuery ajax调用始终相关,请参见T.J的答案。then
属性,但不一定是$.ajax()
请求。 “我想确保函数类型(包含在对象中)实际上是一个ajax请求”。 - guest271314then
方法,那么它就是一个“thenable”Deferred/Promise,并且即使它不是一个ajax调用,它也具有通常的回调函数。 - adeneo.done
、.fail
和.always
是deferred API的一部分,因此不仅限于ajax请求。 - MinusFour$.ajax()
请求,而不仅仅是具有 then
属性?请参见 OP 在 _"我想确保函数类型(包含在对象中)实际上是一个 ajax 请求"_。 - guest271314setRequestHeader
等。 - adeneo尝试检查 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()
请求时调用
所有
ajaxComplete
处理程序都会被调用,无论完成了什么Ajax请求。如果必须区分请求,请使用传递给处理程序的参数。每次执行ajaxComplete
处理程序时,都会传递事件对象、XMLHttpRequest
对象和用于创建请求的设置对象。
$(document).on("ajaxComplete", function(event, xhr, settings) {
// do stuff
})
// 做其他的事情
;可以在else
语句中使用$.when(obj).always()
来处理既没有被明确地完成也没有被拒绝的对象。 - guest271314虽然这是一个老问题,但我认为所有答案都不够令人满意。如果将来有人真的想检查传递的对象是否为 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;
}
js
吗? - guest271314