检查函数是否为 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
对象。
您可以测试您得到的对象上是否存在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)) {
...
}
我想确保函数的类型(来自对象中(在 事实上,一个 ajax 请求,以便可以在其上调用 .done/.fail/.always。
来自 jQuery.ajax(( 文档:
$.ajax(( 从 jQuery 1.5 开始返回的 jqXHR 对象实现了 承诺接口,为他们提供所有属性、方法和 承诺的行为(有关更多信息,请参阅延迟对象(。
jqXHR 对象的可用承诺方法包括:
jqXHR.done(function( data, textStatus, jqXHR ( {}(;另一种选择 构造到成功回调选项,.done(( 方法替换 已弃用的 jqXHR.success(( 方法。请参考 deferred.done(( 实现详细信息。
jqXHR.fail(function( jqXHR, textStatus, errorThrow ( {}(;一 错误回调选项的替代构造,.fail(( 方法 替换已弃用的 .error(( 方法。请参考 deferred.fail(( 实现详细信息。
jqXHR.always(function( data|jqXHR, textStatus, jqXHR|errorThrow ( { }(;* 完整回调选项的替代构造,即 .always(( 方法替换了已弃用的 .complete(( 方法。
相关问题/解答:
- 有什么方法可以检查变量是否是真正的 jqXHR?
- 如何判断对象是否为 jQuery 承诺/延迟?
检查某物是否是承诺,或者在jQuery的情况下是延迟的,可以通过检查对象是否"可"然后"来完成,即它有一个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
}
或者,使用 .ajaxComplete()
,应在完成$.ajax()
请求时调用
调用所有
ajaxComplete
处理程序,无论 Ajax 如何 请求已完成。如果必须区分请求, 使用传递给处理程序的参数。每次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。
- ajax请求的顺序总是不同的
- 从ajax请求中获取javascript对象
- Ajax请求文档就绪会导致jquery加载缓慢
- MockJax没有在JavaScript应用程序中发送对我AJAX请求的响应
- 正在传递JSONP标头's数据参数到另一个文件中的AJAX请求
- JavaScript代码未正确检查ajax请求
- "日期“;AJAX请求返回的类型值未定义
- 在等待ajax请求时显示微调器并禁用页面
- 跨域ajax请求
- Ajax请求返回空的数据字符串,但首先得到了正确的数据
- Javascript-如何让脚本与Ajax请求的数据一起运行
- ajax请求成功,但可以'我看不到我的数据
- 如何将给定的curl命令复制为jquery ajax请求
- 为什么我能够从javascript控制台发送跨域ajax请求
- 一台特定计算机的Ajax请求数据未定义/失败
- 获取ajax请求的请求头
- 原型Ajax请求参数为嵌套json
- 可以't从AJAX请求中筛选数据
- jQuery Mobile Collapse上的AJAX请求
- 暂停函数执行流程,直到ajax请求完成