如何检查一个对象是否为jQuery Xhr对象

3

基本上,我的情况是我想检查一个对象是否是jQuery XHR(如.ajax()请求返回的jqXHR)——而不仅仅是普通的Deferred对象。

我尝试过检查它是否是$.Deferred的实例,所以有点不同:

xhrObj instanceOf $.Deferred       //false

我不在文档或代码中看到哪个构造函数,有没有办法实现这个?

@JonathanLonowski 但是xhrObj是一个延迟对象吗?它不是一个Promise吗? - A. Wolff
请澄清一下。您想知道它是一个 Promise 对象还是 jqXHR 对象。jqXHR 是一个 Promise 对象,但并非所有 Promise 对象都是 jqXHR 对象。 - Kevin B
1
编辑--我不认为这是重复的,因为我想知道它是否是jqXHR而不仅仅是延迟对象。 - Evan Hobbs
@EvanHobbs 然后你应该检查 getAllResponseHeaders 方法,我的看法是这样的。 - A. Wolff
@A.Wolff 谢谢。那也是我得出的结论,尽管使用 setRequestHeaders。 - Evan Hobbs
1个回答

4
你可以检查任何延迟应该具有的属性,例如donefailalwaysstate等。 done似乎是延迟对象(承诺也有)应该具有的属性之一,这在其他jQuery对象中并不常见。
var def = new $.Deferred();

if ('done' in def)

并检查其是否为 promise

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

isPromise = 'abort' in ajax;

谢谢!我正在使用您的方法,但我想知道它是否是jqXHR而不仅仅是普通的$.Deferred(我认为我在我的问题中没有表述清楚)...我决定检查setRequestHeader,因为jqXHR有它,但普通的promise没有。虽然您可能需要稍微更新答案,但我将把您的标记为正确的。 - Evan Hobbs
1
@EvanHobbs - 嗯,那样的东西应该可以工作,似乎 Promises 有“abort”,而 Deferreds 没有? - adeneo
是的,但是想法是要告诉它是否为jqXHR而不仅仅是普通的Deferred。如果它有“done”,“fail”,“always”等,则为Deferred,但不一定是具有其他属性的jqXHR Deferred。这就是为什么我建议像“setRequestHeaders”这样只有jqXHR才有的东西。 - Evan Hobbs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接