如何确定 jQuery 对象是否延迟
How can I determine if a jQuery object is deferred?
如果我有一个函数,有时返回延迟对象,但有时返回非延迟对象。我怎么知道是哪一个?
根据您的使用案例,您还可以使用 jQuery.when
[1]:
如果将单个参数传递给
jQuery.when
并且它不是延迟参数,则该参数将被视为已解决的延迟参数,并且附加的任何 doneCallback 都将立即执行。
有了jQuery.when
,你可以把你的神秘物体总是当作延迟的:
// x could be a deferred object or an immediate result
var x = getMysteriousObject();
// success will be called when x is a deferred object and has been resolved
// or when x is an immediate result
jQuery.when( x ).then( success, error );
[1] http://api.jquery.com/jQuery.when/
由于 jQuery Deferreds 是通过复制隐藏对象的方法而不是在函数上调用 new 运算符来创建的,因此您无法证明该对象确实是 jQuery.Deferred 的实例。我认为你需要使用鸭子打字:
"当我看到一只鸟像鸭子一样走路,像鸭子一样游泳,像鸭子一样嘎嘎叫时,我称那只鸟为鸭子。 - 詹姆斯·惠特科姆·莱利
根据可能返回的对象(必须返回哪些属性),检查是否存在特定的属性/方法:
var x = getMysteriousObject();
if (x.promise) {
// Deferred
} else {
// Not a deferred
}
如果需要,您可以详细说明此检查:
if ($.isFunction(x.promise)) {
// Deferred
}
或(区分延迟对象和 Promise 接口的其他实现)
if (x.promise && x.resolve) {
// Deferred
}
受到Niko的回答的启发,我创建了另一个实现,该实现将根据其属性的名称以及这些属性的内容检查对象是否为延迟对象。 我不得不这样做,因为我的另一个对象有一个名为 promise 的属性。
if (typeof value.resolve !== "function") {
return false;
}
return String(value.resolve) === String($.Deferred().resolve);
相关文章:
- 这是否可能延迟客户端的UpdatePanel更新
- 是否有一个Javascript函数可以使代码在运行时延迟
- 是否有任何方法可以像处理jQuery中附加到XHR延迟对象的done方法处理程序一样处理websocket onmess
- 是否可能/如何像谷歌插件一样为jQuery自动完成设置延迟
- 是否“;onload()"HTML的延迟与加载javascript的延迟冲突
- 如何确定 jQuery 对象是否延迟
- 执行函数时,javascript 是否有一些延迟
- 是否可以在 Backbone.js 中延迟获取集合中的模型,同时有时获取(和发布)整个集合
- 异步和延迟语法是否可以异步=“异步”
- 是否有一个好的图表 API,可以在滚动/缩放时使用 Ajax 延迟加载大型数据集
- 服务器的响应延迟超过24小时-是否可能
- 是否可以延迟加载Jquery(而不是插件)
- 是否可以延迟用户访问的第一个页面上的元素加载
- jQuery.css():属性中是否存在固有延迟's对元素的应用程序
- 是否有可能创建一个节流函数,它可以将另一个函数(也有参数)和时间延迟作为参数
- 给setInterval或setTimeout传递一个分数延迟是否安全?
- 是否使用负延迟调用setTimeout
- 在PhantomJS中,page.switchToFrame(k)是否需要延迟才能调用page.evaluate()来识
- JavaScript中的setTimeout是否接受实(浮点)延迟times_ ?
- 在JavaScript中是否有一种方法可以延迟处理web套接字消息,直到设置了标志