让我们创建一个简单的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对象?承诺对象的目的是什么?为什么功能上存在这种冗余?
答案 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