2017-12-05 3 views
0

Ich habe eine Funktion (sendemail), wie Sie hier sehen:Wie wird eine Promise-Funktion in der For-Schleife zurückgegeben?

public async sendEmail (log: LogMessage): Promise<void> { 
nodemailer.createTestAccount(async() => { 
     return ServiceFactory.getSystemService().getNetworkPreferences().then(async (networkPreferences) => { 
.... 

ich es in einer for-Schleife verwenden möchten:

for (const log of logs) { 
      const timestamp = moment(log.creationDate) 
      const startTime = new Date(Date.now()) 
      if ((timestamp.diff(startTime)) >= rule.miliSecond && category.includes(log.category)) { 

      return this.sendEmail(log) 
      } 
     } 

ich nicht löschen kann "return this.sendEmail (log)" , weil die Funktion Promise zurückgibt. Aber die Schleife funktioniert nur einmal und mit dem ersten Protokoll würde es beendet werden. Wie kann ich die Funktion in dieser Schleife verwenden?

+0

https://stackoverflow.com/questions/43258568/for-await-of- simple-example-typescript –

+0

Ich bin mir ziemlich sicher, dass du ein Versprechen für 'nodemailer.createTestAccount' abgeben solltest und' erwarte' das. Übergeben Sie keine Async-Funktion als Callback. – Bergi

Antwort

2

Sie müssen alle Versprechen in einem Array setzen und ein Versprechen erstellen, das abgeschlossen wird, wenn alle sendEmail Versprechen abgeschlossen sind.

sendAll() { 
    let allMails: Promise<void>[] = []; 
    for (const log of logs) { 
     const timestamp = moment(log.creationDate) 
     const startTime = new Date(Date.now()) 
     if ((timestamp.diff(startTime)) >= rule.miliSecond && category.includes(log.category)) { 

      allMails.push(this.sendEmail(log)); 
     } 
    } 
    return Promise.all(allMails); 
} 

Die obige Version startet alle Anfragen parallel. Wenn Sie sendEmail ausführen möchten sequentiell können Sie verwenden async/await warten, während eine E-Mail ent ist, bevor Sie den nächsten senden:

async sendAll() : Promise<void>{ 
    for (const log of logs) { 
     const timestamp = moment(log.creationDate) 
     const startTime = new Date(Date.now()) 
     if ((timestamp.diff(startTime)) >= rule.miliSecond && category.includes(log.category)) { 

      await this.sendEmail(log); 
     } 
    } 
} 
Verwandte Themen