2017-10-28 4 views
0

Ich möchte mehrere Versprechen erstellen, und ich interessiere mich wirklich nicht für Rennen in diesem Code, solange alle Rückrufe durchgeführt werden. SoNode.js: Einzelne Variable, mehrere Versprechen

, ich habe eine Variable, die alle Daten enthält, sagen wir mal:

export interface IData { 
    data1: string[], 
    data2: string[], 
    data3: string[] 
} 

Die 3 sind unabhängig, und ich habe eine Datenabholer .. sagen wir:

function getData(id: string): Promise<IData> { 
    return new Promise((resolve, reject) => { 
     var data = new TableFetcher(); 
     data.get(_id) 
     .then((result : IData) => { 
      resolve() 
     }) 
    }) 
} 

Jetzt, Ich möchte etwas wie:

function x(): Promise<IData> { 
    return new Promise((resolve,reject) => { 
     var data: IData = { 
      data1: getData('100'), 
      data2: getData('200'), 
      data3: getData('300') 
     } 
     resolve(data) 
    }) 
} 

machen, wenn alle getData Versprechungen abgeschlossen sind.

Es muss nicht verketten, aber alle können separat ausgeführt werden, aber ich muss ein Array mit allen asynchronen Daten zurückgeben, nachdem sie fertig sind.

Wie kann ich das tun?

Antwort

5
  1. Vermeiden Sie die Promise constructor antipattern!
  2. Verwenden Promise.all ein Versprechen für die Ergebnisse aus einer Reihe von Versprechungen zu machen:

function getData(id: string): Promise<string[]> { 
    return new TableFetcher().get(id); 
} 
function x(): Promise<IData> { 
    return Promise.all([ 
     getData('100'), 
     getData('200'), 
     getData('300') 
    ]).then(([data1, data2, data3]) => { 
     return <IData>{data1, data2, data3}; 
    }); 
} 
+0

ah ... danke .. – Magician

+0

sah ich 'provey.all' Konstrukt, aber ich kann dort' reject' nicht finden. Wie kann ich 'reject' an den Aufrufer von x() senden? – Magician

+1

@Magician Wenn eine der Versprechen, die an Promise.all() übergeben wurden, abgelehnt wird, wird das resultierende Versprechen ebenfalls abgelehnt. – Thomas

-1

function x(): Promise<IData> { 
 
    return new Promise((resolve, reject) => { 
 
     Promise.all([getData('100'), getData('200'), getData('300')]) 
 
      .then(result => { 
 
       var data: IData = { 
 
        data1: result[0], 
 
        data2: result[1], 
 
        data3: result[2] 
 
       } 
 
       resolve(data) 
 
      }) 
 
      .catch(err => { 
 
       reject(err) 
 
      }) 
 

 
    }) 
 
}

Verwandte Themen