2016-08-08 22 views
0

Ich schreibe Angular 1.x mit TypeScript, und ich habe einen Service (DataService), der für das Laden von Daten zuständig ist. Für ein einfaches Beispiel fragt es nach einem Knoten ab und gibt einen Knoten zurück. In der Schnittstelle:Wie umgehe ich einen Rückgabetyp mit einem Versprechen in TypeScript?

getNode(id: number): ng.IPromise<Node>; 

und die Umsetzung:

getNode(id: number) { 
      return this.ajaxService.getNode(id) 
       .then((result: ng.IHttpPromiseCallbackArg<Node>) => { 
        return new Node(result.data.ID, result.data.Name); 
       }); 
     } 

Allerdings würde Ich mag einen anderen Dienst einzuführen, um diese Ergebnisse und gibt sie speichert, wenn ich bereits für sie vor abgefragt haben. So etwas wie:

getNode(id: number) { 
     var loadedNode = this.storageService.nodes.filter(e => (e.ID == id)); 
     if (loadedNode.length > 0) { 
      return loadedNode[0]; 
     } 

     return this.ajaxService.getNode(id) 
      .then((result: ng.IHttpPromiseCallbackArg<Node>) => { 
       var n = new Node(result.data.ID, result.data.Name); 
       this.storageService.nodes.push(n); 
       return n; 
      }); 
    } 

schlägt jedoch fehl, der Rückgabetyp, weil es erwartet ‚ng.IPromise‘ und nicht nur ‚Knoten‘. Wie kann ich 'return loadedNode [0]; in eine Art von Versprechen Rückgabetyp statt das eigentliche Objekt zurückgeben?

Antwort

2

Sie können es so machen, mit der $q-service:

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

    var loadedNode = this.storageService.nodes.filter(e => (e.ID == id)); 
    if (loadedNode.length > 0) { 
     // immediately resolve with the cached node 
     deferred.resolve(loadedNode[0]); 
    } else { 
     // else load through service 
     this.ajaxService.getNode(id) 
      .then((result: ng.IHttpPromiseCallbackArg<Node>) => { 
       var n = new Node(result.data.ID, result.data.Name); 
       this.storageService.nodes.push(n); 

       // resolve with the loaded node 
       deferred.resolve(n); 
      }); 
    } 

    // return the promise to register callbacks 
    return deferred.promise; 
} 

Verbrauch:

myService.getNode(id).then((node) => { 
    // success 
},() => { 
    // error 
}); 
+0

Ja, das ist es genau! Cool, danke! – RamblerToning

+0

Muss ich den Rückgabetyp in der Schnittstelle ändern? Im Moment ist es getNode (ID: Nummer): ng.IPromise ; Aber TypeScript scheint nicht zu erscheinen, dass es wissen sollte, dass der Rückgabetyp ein Versprechen eines Knotens ist. Das verursacht jetzt keine Probleme, aber ich habe versucht, dies auf einer anderen Methode zu verwenden getChildren (id: number): ng.IPromise ; Und TypeScript weiß nicht, die versprochene Rückgabetyp ist ein Array – RamblerToning

+0

Mein eigenes Problem gelöst, indem Sie den Rückgabetyp auf die Methode selbst, nicht nur auf der Schnittstelle. – RamblerToning

1

Verwendung $ Frage: Wann (Wert, [successCallback], [errorCallback], [progressCallback]

)

können Sie die Rücklaufleitung mit

ändern
return $q.when(loadedNode[0]); 

mehr Infos unter angular $q