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

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

defer = $.Deferred( function ( defer ) { setTimeout( defer.resolve, 3000 ); }); 

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

让我们也检索Deferred对象的承诺:

 promise = defer.promise(); 

现在,要添加在解析Deferred对象后将要调用的回调,我们可以使用.done().then() 。 但是,我们可以在Deferred对象本身或其自己的promise对象上调用此方法。

 defer.then( handler ); 

要么

 promise.then( handler ); 

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

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

 $.when( defer ).then( handler ); 

要么

 $.when( promise ).then( handler ); 

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

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

所以,我的问题是因为我们可以在Deferred对象本身上调用.promise()等,因为我们可以将该Deferred对象传递给$.when() ,那么.promise()和检索promise对象? promise对象的目的是什么? 为什么function上存在这种冗余?

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

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

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

当使用Deferred对象的“promise”时,观察者(等待解析例子的对象)不能直接访问Deferred对象本身,因此他们不能调用Deferred的方法“Resolve”。 这是一种保护原始Deferred的方法。

使用Deferred,您可以控制其状态set

谈到Promise,您可以阅读状态并附加回调。 get