2015-12-12 9 views
7

Sto imparando angolare e dattiloscritto.Come implementare il pattern di attesa astro di Typescript: dove si trova la promessa

Ho un CustomerService in questo servizio. Ho un metodo che desidero restituire a un array di clienti da un servizio RESTfull.

Inizialmente ho creato la mia funzione GetCustomers così:

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; 
    } 

Questa funzione alla fine ottiene i clienti ma ovviamente tornerà _customers prima della HTTPService riceve effettivamente i dati.

A questo punto ho pensato di poter utilizzare Typscript async/await e questo è quando finisco in un pasticcio.

ho voluto scrivere la mia funzione come questa:

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; 
    } 

immediatamente ottengo questo errore: Errore Tipo TS1055 'Dtos.ICustomer []' non è un tipo di funzione asincrona di ritorno valido.

ho trovato questo Async/Await , simple example (typescript)

tuttavia utilizza un oggetto di promessa: tornare nuova promessa

Se tento di ri-scrivere il mio metodo GetCustomers firma così:

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

ottengo ed errore :

Impossibile trovare il nome "Promise"

Devo importare qualcosa per ottenere una promessa?

+0

Possibile duplicato di [Async/Await, semplice esempio (dattiloscritto)] (http://stackoverflow.com/questions/32401741/async-await-simple-example-typescript) –

+0

Sì, l'ho visto ma sul mio fine Promise non esiste? Il dattiloscritto sembra non sapere nulla su Promise. se cambio la mia firma del metodo su pubblico asCronico GetCustomers(): Promise {...} Viene visualizzato un messaggio di errore "Impossibile trovare il nome 'Promise') – John

+0

Beh, questo sicuramente rende la tua domanda diversa da quello collegato, per favore modificalo per includere questa informazione –

risposta

1

Lo consiglio a guardare il angolare $ q Promessa Oggetto: https://docs.angularjs.org/api/ng/service/ $ q

Gestisce quello che vi serve per la promessa.

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; 
    } 

Assicurarsi di iniettare l'oggetto q $ nel controller:

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

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

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

P.S. - C'è un file di battitura disponibili presso Sicuramente digitato: http://definitelytyped.org/

È possibile installare definizione 'q' tipografico via TSD (ora sconsigliato) o typings

0

nel file tsconfig.json, sotto compilerOptions:

è necessario aggiungere:

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

Io uso il target es2015, ma la lib esiste anche per altri target. in vscode, avrai intellisense.