【发布时间】:2012-06-13 11:17:19
【问题描述】:
如果我有一个有时返回延迟对象但有时返回非延迟对象的函数。我怎么知道它是哪一个?
【问题讨论】:
-
“类型检查”暗示其他方面:)
-
不错,这里有同样的问题
标签: javascript jquery jquery-deferred
如果我有一个有时返回延迟对象但有时返回非延迟对象的函数。我怎么知道它是哪一个?
【问题讨论】:
标签: javascript jquery jquery-deferred
由于 jQuery Deferred 是通过复制隐藏对象的方法而不是在函数上调用 new 运算符来创建的,因此您无法证明该对象确实是 jQuery.Deferred 的实例。我认为您需要使用 Duck-Typing:
“当我看到一只像鸭子一样走路、像鸭子一样游泳、像鸭子一样叫的鸟时,我称那只鸟为鸭子。” ——詹姆斯·惠特科姆·莱利
根据可能返回的对象(必须预期的属性),检查是否存在特定属性/方法:
var x = getMysteriousObject();
if (x.promise) {
// Deferred
} else {
// Not a deferred
}
如果需要,您可以详细说明此检查:
if ($.isFunction(x.promise)) {
// Deferred
}
or(区分 Deferred 对象和 Promise 接口的其他实现)
if (x.promise && x.resolve) {
// Deferred
}
【讨论】:
根据您的用例,您还可以使用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 );
【讨论】:
受Niko's answer 的启发,我创建了另一个实现,该实现将根据对象的属性名称检查对象是否被延迟以及这些属性的内容。我必须这样做,因为我的另一个对象有一个名为 promise 的属性。
if (typeof value.resolve !== "function") {
return false;
}
return String(value.resolve) === String($.Deferred().resolve);
【讨论】: