2016-01-19 173 views
1

關於$ HTTP的官方文檔:

的$ HTTP API是基於由$ Q 服務公開的遞延/承諾的API。

的$ HTTP服務是一個函數,它接受一個參數 - 一個 配置對象 - 這是用來生成一個HTTP請求, 返回一個承諾

那麼什麼是下面的代碼的含義:

var deferred = $q.defer(); 
var promise = deferred.promise; 
var progress; 
$http.get("https://api.github.com/repos/angular/angular.js/pulls") 
.success(function(data){ 
    var result = []; 
    for(var i = 0; i < data.length; i++){ 
     result.push(data[i].user); 
     progress = (i+1)/data.length * 100; 
     deferred.notify(progress); 
    } 
    deferred.resolve(result); 
    }) 
.error(function(error){ 
    deferred.reject(error); 
}); 
return promise; 

如果$ HTTP返回一個承諾,我爲什麼要使用$ q返回一個承諾?

+0

嗯。這很奇怪。通常情況下,你只需要做一些類似'.success()。then()'的東西。我想知道他們的文檔是否令人難以置信地過時,或者由於某些原因angular不支持承諾鏈接。 – m0meni

+0

@ AR7,Angular確實支持承諾鏈接,而不是使用'success()'方法,現在已經廢棄了。有關詳細信息,請參閱下面的答案。用'$ http.get()。然後()'一切按預期工作。 – lex82

回答

1

使用$http服務的推薦方法是這樣的:

$http({ 
    method: 'GET', 
    url: '/someUrl' 
}).then(function successCallback(response) { 
    // success code here 
    }, function errorCallback(response) { 
    // error handling code here 
    }); 

在這種情況下,你不必返回一個新的希望,但是可以只返回結果按照您的預期致電then()

然而,success()方法是通過響應對象的字段作爲單獨的參數已經一個方便的方法:

.then(function(response) { 
    // do something with response.data, response.status, etc. 
}) 

.success(function(data, status, headers, config) { 
    // do something with data, status, etc. 
}) 

然而,在對比then()success()不返回承諾。我不會推薦使用它,而我剛剛在the docs中看到,它現在已被棄用。

更新:我認爲另一個承諾在您提供的實例構造的原因並不是success()可以使用,但在調用deferred.notify(progress)是可能的。如果不明確另外承諾,您將無法訪問deferred對象。

+0

什麼退貨承諾是$ http(),不成功() – dylan

+0

你是什麼意思? '$ http.get()'返回一個承諾。如果你在這個承諾上調用'.then()',你會獲得另一個承諾(例如你可以從你的函數中返回)。然而,'success()'不會返回一個承諾。所以,如果你想使用'success()',你必須使用'$ q.defer()'創建另一個承諾,並手動將它們連接在一起。 – lex82

+0

@ kuma,我更新了我的答案。是否清楚您的代碼將不得不被更改以避免明確創建另一個承諾?如果沒有,我會將它添加到我的答案。 – lex82

0

$ http正在返回一個承諾,我們使用該承諾並因此獲得'成功'(也可以使用'then')。如果你使用這個$ HTTP調用的服務,從您的控制器調用這個服務方法,那麼你將要返回來自該方法的承諾,這樣你就可以。然後使用和.catch的等

0

一個新實例通過調用$ q.defer()來構造延遲。 遞延對象的目的是揭露有關承諾情況,以及可用於信令的成功不成功完成,還有 任務狀態的API

$ q與角度中的$ rootScope.Scope Scope模型觀察機制集成在一起,這意味着更快的分辨率或拒絕傳播到模型中,並避免不必要的瀏覽器重繪,從而導致UI閃爍。

refernce:官方文件