簡體   English   中英

在Angular服務中使用$ http時,為什么返回承諾和數據?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM