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

Waw*_*her 48 javascript jquery jquery-deferred

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

Jul*_*her 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 );
Run Code Online (Sandbox Code Playgroud)

[1] http://api.jquery.com/jQuery.when/

  • `$ .when({testing:123}).done(function(x){alert(x.testing); // Alerts"123"}); (2认同)

Nik*_*iko 30

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

"当我看到一只像鸭子一样散步,像鸭子一样游动,像鸭子一样呱呱叫的鸟儿时,我称这只鸟为鸭子." - James Whitcomb Riley

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

var x = getMysteriousObject();
if (x.promise) {
    // Deferred
} else {
    // Not a deferred
}
Run Code Online (Sandbox Code Playgroud)

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

if ($.isFunction(x.promise)) {
    // Deferred
}
Run Code Online (Sandbox Code Playgroud)

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

if (x.promise && x.resolve) {
    // Deferred
}
Run Code Online (Sandbox Code Playgroud)