49

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

4

3 回答 3

54

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

如果传递给单个参数jQuery.when并且它不是 Deferred,它将被视为已解决的 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/

于 2012-08-28T14:03:09.300 回答
30

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

“当我看到一只像鸭子一样走路,像鸭子一样游泳,像鸭子一样嘎嘎叫的鸟时,我称那只鸟为鸭子。” ——詹姆斯·惠特科姆·莱利

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

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

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

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

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

if (x.promise && x.resolve) {
    // Deferred
}
于 2012-06-09T22:57:18.383 回答
1

Niko 的回答启发,我创建了另一个实现,该实现将根据对象属性的名称以及这些属性内容来检查对象是否为延迟对象。我必须这样做,因为我的另一个对象有一个名为 promise 的属性。

if (typeof value.resolve !== "function") {
  return false;
}
return String(value.resolve) === String($.Deferred().resolve);
于 2015-07-10T16:11:47.383 回答