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

时间:2011-11-10 00:14:43

标签: javascript jquery deferred

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

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

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

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

promise = defer.promise();

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

defer.then( handler );

promise.then( handler );

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

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

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

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

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

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

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

3 个答案:

答案 0 :(得分:25)

它创建了延迟值的“密封”副本,没有.resolve().reject()方法。来自the documentation

  

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

说到Promise,你可以阅读状态并附上回调。 get