假设我有一个ajax方法,它没有返回的承诺,所以我会做这样的事情:
promises.setPreferredService = function(id) {
var deferred = $.Deferred();
nsAddressAjaxService.setPreferredAddress(id, {
callback: function(data) {
deferred.resolve(data);
}
});
return deferred.promise(); // I could also return only `deferred`
};
在我的方法的返回中,我可以返回deferred.promise()
,也可以只返回deferred
,我可以同时返回这两个:
promises.setPreferrredService.done(callback);
那么返回deferred.promise()
和只返回deferred
有什么区别呢?
那么返回
deferred.promise()
和只返回deferred
有什么区别呢?
您希望返回deferred.promise()
,这样调用代码就不能调用resolve
或reject
或其他Deferred特定的方法。这不是调用者应该访问的东西。它应该只能消费promise,而不能影响其状态。
您不应该公开deferred
,而应该只公开只读promise
。
deferred
是控制动作完成的机制,但promise
只是看到结果的一种方式。您不希望外部方法能够完成或拒绝操作。
promise不会公开允许解析它的接口。您只能等待结果并对其进行操作。
延期不仅仅是一个承诺,它还允许您解决或拒绝它。
如果返回实际的deferred
,那么调用者可以通过调用deferred.resolve()
来resolve
。您希望返回promise,以便调用者可以将其链接起来,等等,但实际上并没有决定其解决方案。