2017-08-16 6 views
0

Ich schreibe eine Service-Methode, die ein Versprechen zurückgibt, ein Objekt von einer API zu erhalten. Das Objekt wird mit einem Array von Verknüpfungen zurückgegeben, um auch untergeordnete Objekte aus der API abzurufen. Der Schlüssel hier ist, dass ich nicht möchte, dass das äußere Versprechen aufgelöst wird, bis alle untergeordneten Objekte abgerufen und zum übergeordneten MyType hinzugefügt wurden. Das Folgende ist SCHLIESSEN zu dem, was ich will, aber ich weiß nicht, wie man das Versprechen bekommt, auf die Kinderobjekte zu warten, bevor es zurückkehrt.Auflösen mehrerer Versprechen innerhalb eines Versprechens

private getRegistrationDetailsPromise(url: string): Promise<MyType> {  
    return new Promise<MyType>((resolve) => { 
    return this.dataService.GetMyType(url) 
     .then((myType: MyType) => {      
      _.forEach(myType.childReferences, function(childUrl) { 
      let child = this.dataService.GetChild(childUrl).then((child) -> { 
       myType.children.push(child); 
      }; 
     };     
     return (x); 
    }); 
}); 
+2

Sie haben bereits ein Versprechen; Sie sollten 'new Promise()' nicht aufrufen. – SLaks

+0

Ich wollte Ihnen eine fertige Code-Lösung anbieten, die 'Promise.all()' verwendet, um auf Ihre Versprechensschleife zu warten, aber ich kann die Details dessen, was Sie zu tun versuchen, nicht wirklich verstehen. Sie haben auch ein Anti-Pattern, wenn Sie interne Versprechen mit "new Promise()" umhüllen. Sie müssen das auch nicht tun. Du kannst nur innere Versprechen zurückgeben, Dinge zu verketten und 'Promise.all()' zu verwenden, um auf mehrere Versprechen zu warten. – jfriend00

+1

Auch, warum im Zeitalter von ES6 und ES7 immer noch '_.forEach()' benutzt wird, was die ineffizienteste Art ist, ein Array zu iterieren. In diesem Fall sollten Sie 'myType.childReference.map()' wahrscheinlich verwenden, um ein Array von untergeordneten Versprechen zu sammeln, die an 'Promise.all()' übergeben und dann vom inneren '.then() '-Handler zurückgegeben werden können. – jfriend00

Antwort

2

ändern _.forEach zu .map(), und schicken Sie das verschachtelte Versprechen aus dem Rückruf.
Das wird Ihnen eine Reihe von Versprechen geben.

Sie können dieses Array dann an Promise.all() übergeben, um ein Versprechen zu erhalten, das auf alle wartet.

Schließlich möchten Sie dieses Versprechen aus Ihrer Versprechenskette zurückgeben.

+0

Danke, alle für ihre Hilfe. Das macht jetzt Sinn für mich. Außerdem schreibe ich nicht häufig in Typescript und habe nicht mit ES6/ES7-Änderungen Schritt gehalten. Gibt mir etwas anderes zum arbeiten, was gut ist. –

Verwandte Themen