2017-05-30 2 views
0

ich durch AngularJS viele asynchronen Funktionen mit derselben Signatur entwickelt, die app.Domain.GenericModel.EntityBase (mein generisches Modell) Dies ist ein Beispiel:Versprechen Rückkehr < void > statt Versprechen <any>

get(resource: string): ng.IPromise<app.Domain.GenericModel.EntityBase[]> { 
      var self = this; 
      var deferred = self.qService.defer(); 
      self.httpService.get(resource).then(function (result: any) { 
       deferred.resolve(result.data); 
      }, function (errors) { 
       self.exception = new app.Exceptions.Model.Exception(errors.status, errors.statusText); 
       deferred.reject(self.exception); 
      }); 

      return deferred.promise; 
     } 

ich dann versucht, einige Dienste zu nennen, die mit verketteten promises.So dem vorherigen ähnlich sind, wie ich diesen Fehler habe: „Typ iPromise nicht belegbar ist iPromise, Typ EntityBase ist nicht zuordenbar zu Typ void zu geben“

var self = this; 
    var promise = self.$q.when(); 
    promise = promise.then(() => { 
              return self.EcritureService.get(critureToSave); 
             }).then((compte: EntityBase) => { 
              return self.CompteService.getSingle(Number(data.compte)); 
             }).then((EntityBase) => { 
              currentAccount.montantCpt = currentAccount.montantCpt + montant; 
              return self.CompteService.update(currentAccount:EntityBase); 
             }); 

Ich suche viel nach diesem Dilemma und allem, was ich habe, eine unauffällige Methode, um die Funktionen meiner Funktionen in das gemeinsame Muster "IPromise" durch Typ Zusicherung, die meist auf der Täuschung des Compilers oder etwas Ähnliches zu konvertieren. Ich habe diesen Trick nicht verstanden, wenn jemand anders eine Idee hätte ... könnte er es klären, egal was es effizient ist oder nicht.

Antwort

0

Implizit ist der Typ für die Variable promise in Ihrem Beispiel ng.IPromise<void>, denn das ist, was $q.when() zurückgibt.
Eine Variable vom Typ ng.IPromise<void> kann kein Objekt ng.IPromise<EntityBase> zugewiesen erhalten.
Je nachdem, was Sie erreichen möchten, gibt es verschiedene Dinge, die Sie tun können.

können Sie eine weitere Variable benutzen, um Ihre später Versprechen zu halten:

let anotherPromise = promise.then(() => { ... 

Sie explizit den Typ Ihrer Variable deklarieren können ng.IPromise<any> am Anfang zu sein:

let promise: ng.IPromise<any> = self.$q.when(); 
let promise = promise.then(() => { ... 

Oder könnten Sie haben Ihre Versprechen Kette endet tatsächlich ein Versprechen der Leere:

Es könnte auch andere Optionen geben, aber ich hoffe, das hilft.

+0

Ich bin auf der Suche nach wie Chained Versprechungen ausgeführt werden, die für jede Iteration der Schleife ausgeführt werden müssen. Das ist alles –

Verwandte Themen