2015-12-12 5 views
7

Uczę się kanciastego i Maszynopisu.Jak zaimplementować Asynchroniczny skrypt opisowy: Gdzie jest Obietnica

Mam CustomerService w tej usłudze Mam metodę, którą chcę zwrócić szereg klientów z usługi RESTfull.

Początkowo tworzę GetCustomers funkcję tak:

public GetCustomers(): Dtos.ICustomer[] { 

     var _customers: Dtos.ICustomer[]; 
     this._httpService.get('http://localhost/myTestApi/api/customers/') 
      .success(function (data) { 

       _customers = data as Dtos.ICustomer[]; 
      }).error(function (error) { 
       console.log(error); 
      }); 
     return _customers; 
    } 

Funkcja ta ostatecznie dostaje klientów, ale oczywiście powróci _customers przed HTTPService faktycznie pobiera dane.

W tym momencie pomyślałem, że mógłbym skorzystać z asynchronicznej/czekania na maszynie do pisania i to jest, kiedy kończę bałagan.

Chciałem napisać funkcję tak:

public async GetCustomers(): Dtos.ICustomer[] { 

     var _customers: Dtos.ICustomer[]; 
     await this._httpService.get('http://localhost/myTestApi/api/customers/') 
      .success(function (data) { 

       _customers = data as Dtos.ICustomer[]; 
      }).error(function (error) { 
       console.log(error); 
      }); 
     return _customers; 
    } 

razu uzyskać ten błąd: Error TS1055 typu „Dtos.ICustomer []” nie jest prawidłowym typem asynchroniczny powrót funkcji.

Znalazłem to Async/Await , simple example (typescript)

jednak używa obiektu obietnicy powrotu nowy Obietnica

Gdybym próbować ponownie napisać GetCustomers metoda podpis tak:

public async GetCustomers(): Promise<Dtos.ICustomer[]> {} 

I get i błąd :

Nie można znaleźć nazwy "Obietnica"

Czy muszę zaimportować coś, aby otrzymać obietnicę?

+0

Możliwy duplikat [Async/czekają, prosty przykład (maszynopis)] (http://stackoverflow.com/questions/32401741/async-await-simple-example-typescript) –

+0

Tak widziałem to, ale na mój koniec Obietnicy nie istnieje? Wydaje się, że maszynopis nie wie nic o obietnicy. jeśli zmienię podpis metody na publiczny async GetCustomers(): Obiecuję {...} Pojawia się błąd z informacją "Nie mogę znaleźć nazwy" Obietnica ") – John

+0

To z pewnością powoduje, że twoje pytanie jest inne z połączonego, edytuj go, aby uwzględnić te informacje: –

Odpowiedz

1

Polecam patrząc na Kątowymi $ q Obietnica Obiektu: https://docs.angularjs.org/api/ng/service/ $ q

Zajmuje to co potrzebne do obietnicy.

public getCustomers(): ng.IPromise<Dtos.ICustomer[]> { 
     var lDefer: ng.IDeferred<Dtos.ICustomer[]> = 
      this.$q.defer<Dtos.ICustomer[]>(); 

     this._httpService.get('http://localhost/myTestApi/api/customers/') 
      .then((inResult: any) => { 
       let lResultList: Dtos.ICustomer[] = inResult.data; 
       lDefer.resolve(lResultList); 
      }, 
      (inError: any) => { 
       lDefer.reject(inError); 
      }); 

     return lDefer.promise; 
    } 

Upewnij się, aby wstrzyknąć $ q obiekt w kontrolerze:

import IPromise = angular.IPromise; 
import IDeferred = angular.IDeferred; 

static $inject = ['$q', ...]; 

constructor(protected $q:angular.IQService, ...) { 
    super($q); 
} 

PS: - Jest to plik wpisując dostępny od Zdecydowanie Wpisane: http://definitelytyped.org/

Można zainstalować 'q' definicję maszynopis poprzez TSD (obecnie nie zaleca się) lub typings

0

w pliku tsconfig.json pod compilerOptions:

trzeba dodać:

"lib": ["dom", "dom.iterable", "scripthost","es2015.promise", "es2015"]

Używam celu es2015, ale lib istnieje także dla innych celów. w vscode, będziesz miał intellisense.