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