如何确定 jQuery 对象是否延迟

How can I determine if a jQuery object is deferred?

本文关键字:是否 延迟 对象 jQuery 何确定      更新时间:2023-09-26

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

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

如果将单个参数传递给jQuery.when并且它不是延迟参数,则该参数将被视为已解决的延迟参数,并且附加的任何 doneCallback 都将立即执行。

有了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 运算符来创建的,因此您无法证明该对象确实是 jQuery.Deferred 的实例。我认为你需要使用鸭子打字:

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

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

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

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

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

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

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

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

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