如何确定jQuery对象是否延迟?

时间:2012-06-09 22:33:59

标签: javascript jquery jquery-deferred

如果我有一个函数,有时会返回一个延迟对象,但有时会返回一个非延迟对象。我怎么知道它是哪一个?

3 个答案:

答案 0 :(得分:53)

根据您的使用情况,您还可以使用jQuery.when [1]:

  

如果将一个参数传递给jQuery.when并且它不是延迟的,则它将被视为已解决的延迟,并且所有附加的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/

答案 1 :(得分:30)

由于jQuery Deferreds是通过复制隐藏对象的方法而不是在函数上调用new运算符来创建的,因此无法证明该对象确实是jQuery.Deferred的实例。我想你需要选择Duck-Typing:

  

“当我看到一只鸟像鸭子一样走路,像鸭子一样游泳,像鸭子一样嘎嘎叫时,我称这只鸟为鸭子。”    - James Whitcomb Riley

根据否则可能返回的对象(必须预期的属性),检查是否存在特定的属性/方法:

var x = getMysteriousObject();
if (x.promise) {
    // Deferred
} else {
    // Not a deferred
}

如果需要,您可以详细说明此检查:

if ($.isFunction(x.promise)) {
    // Deferred
}

或(以区分Deferred对象和Promise接口的其他实现)

if (x.promise && x.resolve) {
    // Deferred
}

答案 2 :(得分:1)

Niko's answer的启发,我创建了另一个实现,该实现将根据这些属性的内容的名称来检查对象是否是延迟的。我不得不这样做,因为我的另一个对象有一个名为promise的属性。

if (typeof value.resolve !== "function") {
  return false;
}
return String(value.resolve) === String($.Deferred().resolve);