【问题标题】:How can I determine if a jQuery object is deferred?如何确定 jQuery 对象是否被延迟?
【发布时间】:2012-06-13 11:17:19
【问题描述】:

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

【问题讨论】:

  • “类型检查”暗示其他方面:)
  • 不错,这里有同样的问题

标签: javascript jquery jquery-deferred


【解决方案1】:

由于 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
}

【讨论】:

  • 好的,那么我认为鸭式打字是最好的方法。担心得到鹌鹑而不是鸭子。现在觉得没那么重要。非常感谢!
【解决方案2】:

根据您的用例,您还可以使用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/

【讨论】:

  • 你的“成功”处理程序不会有不同的参数传递给它 - 取决于对象是否被延迟?在这种情况下,您仍将不得不使用下面建议的鸭子类型。
  • @Crungmungus: "如果单个参数被传递给 jQuery.when 并且它不是 Deferred 或 Promise,它将被视为已解决的 Deferred,并且任何附加的 doneCallbacks 都将立即执行。 doneCallbacks 被传递给原始参数。”
  • `$.when( { testing: 123 } ).done(function( x ) { alert( x.testing ); // 警报 "123" });
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-17
    • 2011-11-06
    相关资源
    最近更新 更多