假设我有一个没有承诺返回的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
会有什么不同?
答案 0 :(得分:5)
那么返回
deferred.promise()
或仅返回deferred
会有什么不同?
您希望返回deferred.promise()
,以便调用代码无法调用resolve
或reject
或其他特定于延迟的方法。这不是调用者应该访问的内容。它应该只能消费承诺,而不会影响其状态。
答案 1 :(得分:2)
您不应公开deferred
,只能公开只读 promise
。
deferred
是控制操作完成的机制,但promise
只是查看结果的一种方式。您不希望外部方法能够完成或拒绝操作。
答案 2 :(得分:2)
承诺不会公开允许解析它的界面。您只能等待结果并对其进行操作。
延迟不仅仅是承诺 - 它还允许您解决或拒绝承诺。
答案 3 :(得分:1)
如果您返回实际的deferred
,则来电者可以通过resolve
deferred.resolve()
来{{1}}。您希望返回承诺,以便调用者可以将其链接等,但实际上并未决定其解析。