2017-12-05 12 views
0

あなたがここで見るように私は、関数(のsendEmail)を持っている:ForループでPromise関数を返す方法は?

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

私は、forループでそれを使用したい:

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) 
      } 
     } 

私は "this.sendEmail(ログ)を返し、" 削除することはできません。なぜなら、この関数はPromiseを返すからです。しかし、ループはたった1回だけ動作し、最初のログでは終了します。 このループでどのように関数を使用できますか?

+0

https://stackoverflow.com/questions/43258568/for-await-of-:あなたは順次sendEmailを実行したい場合は、非同期/あなたが次を送信する前に電子メールでENTている間待つように待つを使用することができますsimple-example-typescript –

+0

'nodemailer.createTestAccount'と' await'を約束してください。 'async関数 'をコールバックとして渡さないでください。 – Bergi

答えて

2

すべての約束事を配列に入れて、すべてのsendEmail約束が完了したら完了する約束を作成する必要があります。

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); 
} 

上記のバージョンでは、すべてのリクエストが並行して起動されます。

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); 
     } 
    } 
} 
関連する問題