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

What is the difference of returning a promise() or a deferred in jQuery?

假设我有一个 ajax 方法,它没有 return 的承诺,所以我会做这样的事情:

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`
};

在我的方法 return 中,我可以 return deferred.promise() 或只是 return deferred 两者我都可以这样做:

promises.setPreferrredService.done(callback);

那么 returning deferred.promise() 或仅 return deferred 有什么区别?

您不应公开 deferred,而应仅公开 只读 promise

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

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

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

So what's the difference of returning deferred.promise() or only return deferred ?

您想 return deferred.promise() 以便调用代码无法调用 resolvereject 或其他特定于 Deferred 的方法。这不是调用者应该有权访问的内容。它应该只能消费 promise,而不会影响它的状态。

如果您 return 实际 deferred,那么调用者可以通过调用 deferred.resolve() resolve 它。您想要 return promise 以便调用者可以链接它等,但实际上并不决定其解决方案。