在jQuery中返回promise()或延迟有什么区别?

时间:2015-02-09 16:19:41

标签: javascript jquery ajax promise

假设我有一个没有承诺返回的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会有什么不同?

4 个答案:

答案 0 :(得分:5)

  

那么返回deferred.promise()或仅返回deferred会有什么不同?

您希望返回deferred.promise(),以便调用代码无法调用resolvereject或其他特定于延迟的方法。这不是调用者应该访问的内容。它应该只能消费承诺,而不会影响其状态。

答案 1 :(得分:2)

您不应公开deferred,只能公开只读 promise

deferred是控制操作完成的机制,但promise只是查看结果的一种方式。您不希望外部方法能够完成拒绝操作。

答案 2 :(得分:2)

承诺不会公开允许解析它的界面。您只能等待结果并对其进行操作。

延迟不仅仅是承诺 - 它还允许您解决或拒绝承诺。

答案 3 :(得分:1)

如果您返回实际的deferred,则来电者可以通过resolve deferred.resolve()来{{1}}。您希望返回承诺,以便调用者可以将其链接等,但实际上并未决定其解析。