我如何确定一个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 ); 

[1] http://api.jquery.com/jQuery.when/

由于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);