2015-05-29 26 views
5

Mam więc aplikację Angular, która wykonuje spokojne połączenia z serwerem. Istnieje usługa, która owija połączenia z serwerem. Obecnie mam metodę w usłudze, która po prostu zwraca obietnicę z usługi $ http. Chciałbym dodać dodatkowe przetwarzanie tego wywołania metody, ale nie jestem pewien jak to zrobić ze względu na asynchroniczny charakter obietnicy.Obietnica usług granicznych

Obecnie w maszynopisie:

class BoardService { 
    private $http; 

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

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

Chciałbym dostać się coś takiego:

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

    }); 

    // return manipulated data; 
} 

Jak można to zrobić?

Odpowiedz

10

Ostrożne zdanie ostrzeżenie! Ponieważ obietnice są asynchroniczne, wszystko, co zwraca dane na podstawie danych z obietnicy, samo musi zwrócić obietnicę. Chcesz, aby fetchBoard2 zwróciła obietnicę, która zostanie rozwiązana, gdy obietnica $http powróci i zmanipulujesz dane. Robisz to za pomocą usługi Angular's $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; 
} 

Zarządzanie dodatkowych przedmiotów odroczonego dostaje szybko fiddly, dzięki czemu można używać then wstawić własną manipulacji do rurociągu.

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

Aby uzyskać więcej informacji, oto a good article.

+1

O ile mi wiadomo, .success() zachowują się tak samo jak .then() i zwraca obietnica również. return $ http.get(). success() również zadziała. – Okazari

+3

Prawie - dziękuję za sprawdzenie tego. 'success' zwraca oryginalną obietnicę (zawierającą odpowiedź HTTP), a' then' zwraca nową obietnicę rozwiązaną z wynikiem funkcji, którą mu dajesz. Ref: http://stackoverflow.com/a/23805864/802618 –

+1

Thx za dodanie, nie teraz to, że dokładne. – Okazari

0

Moduł tylko wystawia asynchroniczną wersję XMLHttpRequest, więc podpis, którego szukasz, jest niemożliwy. Jeśli nie chcesz powrócić do innej struktury (na przykład jQuery), musisz użyć zwróconego obiektu Promise.

Wyobraź sobie, że jest to obiekt fabryczny, w którym rejestrujesz programy obsługi, które będą wywoływane po przywróceniu danych. Mogą być powiązane, więc jeśli chcesz przetworzyć dane przed przekazaniem ich dalej, możesz to zrobić w programie obsługi, który rejestrujesz pod numerem then method. Dowolny wynik, który zwrócisz w module obsługi, stanie się danymi następnego handler'a then.

(Należy pamiętać, że w przeciwieństwie do success() argument do obsługi to rodzaj IHttpPromiseCallbackArg nie same dane.)

Powiązane problemy