5

Für einige Typescript-Methoden, die ich baue, brauche ich oft die Asynchronität eines Versprechens, aber ich brauche nicht das Versprechen, einen Wert (konzeptionell gesprochen) zurückzugeben. Ein einfaches Beispiel könnte den Aufruf einer initLanguageStrings() -Methode zum Laden von Sprachzeichenfolgen, die von einer Anwendung verwendet werden, sein. Die Sprachzeichenfolgen werden in eine globale Struktur eingefügt, aber das Versprechen ist immer noch erforderlich, um sicherzustellen, dass die Anwendung erst fortgesetzt wird, nachdem die Sprachzeichenfolgen geladen wurden.Wie man den Ergebnistyp eines Promises ändert < > in TypeScript

Multiple dieses Szenario zwei oder drei Mal und ich binden dann alle der Initialisierung Arbeit in eine Reihe von Versprechen, die alle zusammen abgeschlossen werden müssen, bevor Sie fortfahren. Ich deshalb Promise.all verwenden, wie so (Beispiel):

initialiseApp(): Promise<void> 
{ 
    let promises: Promise<any>[ ] = [ ]; 

    promises.push(this.initLanguageStrings()); 
    promises.push(this.initModelData()); 
    promises.push(this.initUserInfo()); 

    return Promise.all(promises); 
} 

Der obige Code wird nicht wirklich kompilieren (TS1.5/1,6), weil Promise.all() gibt Versprechen < any []> nicht versprechen < void>.

Also, was ich mit dem Schreiben am Ende ist dies:

return new Promise((resolve, reject) => { 
    Promise.all(promises) 
     .then((dummy: any[ ]) => { 
     resolve(); 
     });   
}); 

Ich glaube, das ist semantisch der richtige Ansatz, weil die „Umsetzung“ versteckt eigentlich bleibt, und die „inneren Versprechen“ (von Promise.all) "entkommt" nie dem Aufrufer von initialiseApp().

Aber auf der anderen Seite finde ich diesen Ansatz hässlich, und würde gerne einen schöneren Weg finden, dies zu tun, da die Rückkehr von Promise < void> ein ziemlich häufiges Muster für mich wird.

Gibt es einen besseren Weg, um das zu erreichen, was ich versuche?

Der Compiler erlauben:

return Promise.all(promises).then(() => { }); 

Aber es scheint mir auch als "tricky" und hässlich.

Antwort

3

seit Versprechen < Leere Rückkehr> ist immer ein ganz allgemeines Muster für mich

Sie eine Art Behauptung

initialiseApp(): Promise<void> 
{ 
    let promises: Promise<any>[ ] = [ ]; 

    promises.push(this.initLanguageStrings()); 
    promises.push(this.initModelData()); 
    promises.push(this.initUserInfo()); 

    return Promise.all(promises) as Promise<void>; 
} 

verwenden können Hinweis: Wenn Sie eine Assertion verwenden, sind Sie im Wesentlichen Lügen an den Compiler in diesem Fall. Seien Sie vorsichtig bei Fehlern, bei denen der Compiler eine Sache denkt und die Laufzeit eine andere.

return Promise.all(promises).then(() => { });

Dies ist Recht Weg, es zu tun. Die Laufzeit entspricht , was der Compiler gefolgert hat. Wenn Sie eine Promise<void> ... möchten, dann machen Sie eine Promise<void> was ist, was dieses Codebeispiel tut.

+0

Der Nachteil, den ich bei der Verwendung eines Cast (Typ Assertion) sehe, ist, dass wir nicht nur den Compiler belügen, sondern das Ergebnis "blutet" die Funktion für den Aufrufer aus. Mit anderen Worten, der Aufrufer von initializeApp wird tatsächlich die Any [] von Promise erhalten.alles obwohl die Methode sagt nichts sollte zurückgegeben werden. – Kevmeister68

Verwandte Themen