我如何确定一个jQuery对象是否被延迟?
如果我有一个函数,有时返回一个延期的对象,但有时是一个非延期的对象。 我怎么知道它是哪一个?
根据你的用例,你也可以使用jQuery.when
[1]:
如果将一个parameter passing给
jQuery.when
并且它不是Deferred,则它将被视为已parsing的Deferred,并且将立即执行附加的任何doneCallbacks。
使用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 );
由于jQuery Deferreds是通过复制隐藏对象的方法而不是在函数上调用new运算符来创build的,因此不能certificate对象确实是jQuery.Deferred的一个实例。 我想你会需要跟鸭子打字:
“当我看到一只像鸭子一样走路的鸭子,像鸭子一样游泳,像鸭子一样呱呱叫,我把那只鸟叫做鸭子。 – 詹姆斯惠特科姆莱利
根据可能返回哪些对象(必须指定哪些属性),检查是否存在特定的属性/方法:
var x = getMysteriousObject(); if (x.promise) { // Deferred } else { // Not a deferred }
如果需要,您可以详细检查
if ($.isFunction(x.promise)) { // Deferred }
或(区分Deferred对象和Promise接口的其他实现)
if (x.promise && x.resolve) { // Deferred }
受Niko的回答的启发,我创build了另一个实现,根据它的属性名称来检查一个对象是否是延迟对象,也是这些属性的内容。 我不得不这样做,因为我的另一个对象有一个名为promise的属性。
if (typeof value.resolve !== "function") { return false; } return String(value.resolve) === String($.Deferred().resolve);