2015-02-09 29 views
0

比方說,我有一個不具有承諾要恢復的AJAX方法,所以我會做這樣的事情:在jQuery中返回promise()或延遲有什麼區別?

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

您是否閱讀過文檔? http://api.jquery.com/deferred.promise/ – 2015-02-09 16:22:09

+0

不是真的......但感謝您的參考。 – 2015-02-09 16:25:57

+2

爲什麼你在問之前不這樣做? http://meta.stackoverflow.com/q/261592/139010 – 2015-02-09 16:32:21

回答

5

那麼返回deferred.promise()或僅返回deferred有什麼區別?

要返回deferred.promise()所以調用代碼不能調用resolvereject或其他特定延遲的方法。這不是主叫方應該訪問的內容。它應該只能夠消耗的承諾,不會影響其狀態。

2

您不應該暴露deferred,但只有只讀promise

deferred是控制動作完成的機制,但promise只是查看結果的一種方式。您不希望外部方法能夠完成或拒絕的操作。

2

承諾不公開允許解決它的接口。您只能等待結果並對其進行操作。

推遲不只是一個承諾 - 它也允許你解決或拒絕它。

1

如果返回實際的deferred,則調用者可以通過調用deferred.resolve()來調用resolve。您希望返回承諾,以便調用者可以鏈接它等,但不是實際決定其解決方案。

相關問題