Deferred对象和它自己的promise对象之间有什么区别?

Šim*_*das 28 javascript jquery deferred

让我们创建一个简单的Deferred对象:

defer = $.Deferred( function ( defer ) {
    setTimeout( defer.resolve, 3000 );
});
Run Code Online (Sandbox Code Playgroud)

上面的Deferred对象将处于"pending"状态3秒,然后切换到"已解决"状态(此时将调用绑定到它的所有回调).

我们还检索该Deferred对象的承诺:

promise = defer.promise();
Run Code Online (Sandbox Code Playgroud)

现在,要添加在解析Deferred对象后将要调用的回调,我们可以使用.done().then().不过,我们可以调用这个方法递延对象本身或者它自己的诺言对象.

defer.then( handler );
Run Code Online (Sandbox Code Playgroud)

要么

promise.then( handler );
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,handler都将调用该函数(在这种情况下3秒后).

如果我们使用$.when,我们可以再次传递Deferred对象本身或其promise对象:

$.when( defer ).then( handler );
Run Code Online (Sandbox Code Playgroud)

要么

$.when( promise ).then( handler );
Run Code Online (Sandbox Code Playgroud)

同样,上面两行代码之间没有区别.

现场演示: http ://jsfiddle.net/G6Ad6/

所以,我的问题是因为我们可以在Deferred对象本身上调用.then(),.done()等等,因为我们可以将Deferred对象传递给$.when(),.promise()并且检索promise对象的意义是什么?promise对象的目的是什么?为什么功能上有这种冗余?

小智 25

它创建了延迟值的"密封"副本,没有.resolve().reject()方法.从文档:

deferred.promise()方法允许异步函数防止其他代码干扰其内部请求的进度或状态.

当它被修改的值没有意义时使用它.例如,当jQuery发出AJAX请求时,它返回一个promise对象.在内部,它.resolve()是原始Deferred对象的值,用户可以使用promise来观察.