[英]Why return the promise and the data when using $http in an Angular service?
我經常在網上看到有關Angular服務的教程和摘要,以進行$ http調用,這些調用返回$ http諾言和一些數據。 如果將承諾返回給控制器,那么在服務中返回數據的意義是什么? 我什至不知道返回到哪里。 這是我的意思的示例:
// Function of MyStuffService:
function getStuff() {
return $http.get('/api/stuff')
.success(function(data) {
// Why return data here? How could I even get this returned value?
return data;
})
.error(function(data) {
console.error(data);
});
}
// Controller:
function getStuff() {
MyStuffService.getStuff()
.success(function(data) {
$scope.stuff = data;
})
}
我不能只是將我的服務功能重寫為:
// Function of MyStuffService:
function getStuff() {
return $http.get('/api/stuff')
.error(function(data) {
console.error(data);
});
}
並讓控制器從返回的諾言中獲取數據嗎? 我覺得我不明白這里的內容。 任何幫助是極大的贊賞。
.then
返回的數據可用於下一個鏈接的.then
處理程序,這將是您最終用來獲取數據的方式。
.success
只是中繼了$http.get
的原始承諾。 從.success
返回數據不會執行任何操作。
因此,如果您有:
function getStuff() {
return $http.get('/api/stuff')
.success(function(data) {
// do something with data. returning doesn't do anything
})
.error(function(data) {
console.error(data);
});
};
在控制器中,您將執行以下操作:
getStuff().then(function(response){
$scope.data = response.data; // this is the data available from `$http.get`
}
您引用的教程不會在成功處理程序中返回數據,而是在then處理程序中返回result.data。 然后,生成新的鏈式承諾的那個將被返回。 這將刪除.then中通常存在的http請求數據。
使用.then而不是.success的原因是為了將來進行證明。 .success不是Promise的一部分,它特定於$ http。 如果您決定以后再從另一個異步源(websockets,webworkers)獲取數據,則當您返回的諾言不再具有成功處理程序時,您的代碼將中斷。
通過使其始終返回.then,您可以確保對服務進行足夠的抽象。
通常,如果需要在將數據發送到控制器之前進行一些處理,則可以這樣做。
但是在這種情況下,我同意,因為無需處理數據,因此無需解決服務中的承諾。
在這種情況下,我只需將服務方法重寫為:
function getStuff() {
return $http.get('/api/stuff');
}
如果必須在將數據返回到控制器之前做一些處理,則傾向於使用$ q,如下所示。
function getStuff() {
var defer = $q.defer();
$http.get('/api/stuff')
.then(function(data) {
// some processing
defer.resolve(processedData);
}, function(error) {
defer.reject(error);
});
return defer.promise;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.