2015-04-02 52 views
2

我有2個問題 -AngularJS - Promise vs然後?

1)「success」和「then」有什麼區別? 示例 - $ http.get(url).then vs $ http.get(url).success?

2)承諾意味着將來會被執行的事情,很好。我無法將自己的頭腦放在與函數調用不同的地方。當我們使用「$ q.defer.resolve()」進行調用時,會執行一個promise調用。這不是函數調用嗎?所以爲什麼不能成爲一個普通的函數,並執行任何其他函數調用如foo()?我錯過了一個特別的承諾嗎? ?

+0

[許諾只是回調的一個奇特符號](http://stackoverflow.com/q/22539815/1048572) – Bergi 2015-04-02 14:07:26

回答

4

「success」和「then」有什麼區別?

then()只有一個參數:http響應對象。 success()需要4個參數:響應的數據,響應的狀態,響應的標題和http配置對象。當你關心的是返回的數據時,success()因此更容易使用。正如新開發者所說,返回值是不同的:then()返回一個新的承諾,無論從回調中返回什麼,並允許您返回一個新值,從而構建承諾鏈,而success()返回原始承諾。

一個承諾意味着什麼,將在未來

沒有被執行,而不是真的。承諾是你現在執行的一些事情的結果,但是結果並不是立即可用的。由於JavaScript是單線程的,因此不能阻塞並等待結果,因爲這會完全凍結應用程序。所以你只需註冊一個回調函數,當結果可用時,該函數將被異步調用。例如:

$http.get('/some/url') 

立即發送HTTP請求。但爲了得到結果,我們需要等待字節傳輸到服務器,以便服務器處理請求併發迴響應,並將響應發送到瀏覽器。這可能需要幾秒鐘的時間。因此,$ http.get()立即返回的是一個承諾:即代表未來結果的對象(或者,一旦收到結果,結果就是未來的結果)。

1

.then返回新的承諾。

.success返回原始承諾。另一個區別是,.success獲取response.data作爲輸入參數,而.then獲取response

這是how it's implemented

promise.success = function(fn) { 
    promise.then(function(response) { 
     fn(response.data, response.status, response.headers, config); 
    }); 
    return promise; 
}; 

你可以使用.success(和.error)來處理的$http各自的結果,但沒有修改數據或拒絕承諾(含return $q.reject())給予的能力$http承諾的最終消費者。

這裏是當一個人可以使用.success VS /與.then說明性的例子:

return { 
    getData: function(p1){ 
    return $http.get(url, {p1: p1}) 
      .success($log.log) // can use generic functions since there is 
      .error($log.error) // no requirement to return data 
      .then(function(response){ 
       // here can massage the data into the output format 
       return response.data; 
      }); 
}; 

我建議您始終使用.then,因爲它返回,並且不.success.error處理新的承諾;這避免了API消費者使用$http特定的.success/.error的機會因此無意地作出了在封面下使用$http的假設。