2015-05-29 136 views
5

所以,我有一個Angular應用程序,使服務器的平穩呼叫。有一種服務包裝了對服務器的呼叫。我目前在服務上有一個方法,它只是從$ http服務返回承諾。我想在該方法調用中添加一些額外的處理,但由於承諾的異步性質,我不確定如何去做。角度服務承諾

目前打字稿:

class BoardService { 
    private $http; 

    constructor($rootScope: IRootScope, $http: ng.IHttpService) { 
      this.$http = $http; 
    } 

    fetchBoard(id: number) { 
     return this.$http.get("/api/board/" + id); 
    } 
} 

我希望得到它是這樣的:

fetchBoard2(id: number) { 
    this.$http.get("/api/board/" + id).success(function(data) 
    { 
     // Manipulate the data 

    }); 

    // return manipulated data; 
} 

你會怎麼做呢?

回答

10

棘手的句子警告!因爲承諾是異步的,所以根據承諾的數據返回數據的任何東西都必須返回承諾。您希望fetchBoard2返回承諾,一旦$http承諾回來並且您已處理數據,就會得到解決。您可以通過Angular的$q服務來實現。

fetchBoard2(id: number) { 
    var deferred = $q.defer(); 

    $http.get("/api/board/" + id).success(function(data) { 
    var newData = doSomething(data); 
    deferred.resolve(newData); 
    }); 

    return deferred.promise; 
} 

管理額外的遞延對象得到迅速繁瑣,所以你可以使用then將您自己的操作進入管道。

fetchBoard3(id: number) { 
    return $http.get(...).then(function(data) { 
    return doSomething(data); 
    }); 
} 

欲瞭解更多詳情,這裏的a good article

+1

據我所知,.success()的行爲一樣。那麼(),並返回一個派生諾言也是如此返回$ http.get()。success()也會起作用。 – Okazari

+3

幾乎 - 感謝讓我驗證這一點。 'success'返回最初的promise(包含HTTP響應),'then'返回一個新的promise,這個promise會通過你給它的函數的結果解決。參考:http://stackoverflow.com/a/23805864/802618 –

+1

Thx爲補充,現在沒有這個確切的。 – Okazari

0

$http模塊僅公開XMLHttpRequest的異步版本,因此您要查找的簽名是不可能的。除非想要回退到另一個框架(例如jQuery),否則必須使用返回的對象Promise

把它看作是一個工廠對象,用它來註冊數據返回時將被調用的處理程序。它們可以鏈接在一起,所以如果你想在下游處理數據之前處理數據,你可以簡單地在你使用then method註冊的處理程序中進行處理。您在處理程序中返回的任何結果將成爲下一個then處理程序的數據。

(請注意,與success(),爭論到您的處理是IHttpPromiseCallbackArg類型而不是數據本身)。