结合两个nodejs promise的函数返回.all not not working

时间:2018-01-07 14:49:11

标签: node.js promise

我有两个返回函数(getMoviesForCSVExport,getActressesForCSVExport)。我想将这些返回数据作为两个单独的csv附件发送到单个电子邮件中。

我对nodejs完全陌生,我试图使用promise.all调用这些函数。这是我试过的。请帮我解决这个问题。

 var arr = [dbGetMovies.getMoviesForCSVExport(search,serviceType,status) ,dbGetMovies.getActressesForCSVExport(search,serviceType,status)];

Promise.all(arr).then(values => { 
   .then((movies) => json2csv({ data: movies, fields: dbGetMovies.WHITE_LISTED_CONTRACTOR_FIELDS}))
   .then((csvData) => emails.sendEmailWithCSVExtract(csvData, tokenPayload.email))
   .then(() => response.setStatusCode(204)) 


});

下面的sendEmailWithCSVExtract函数

     function sendEmailWithCSVExtract (
  csvData /* :string */,
  emailAddress /* :string */
) /* :Promise<any> */ {
  return getTemplate('./templates/contractor-export.txt')
    .then((template) => mustache.render(template.toString(), { date: moment.utc().add(1, 'days').format('dddd, MMMM Do YYYY') }))
    .then((messageHtml) => {
      // create Nodemailer SES transporter
      const transporter = nodemailer.createTransport({
        SES: new AWS.SES({ region: 'us-east-1' })
      })

      return new Promise((resolve, reject) => {
        transporter.sendMail({
          from: env('SENDER_EMAIL'),
          to: emailAddress,
          subject: 'CSV Extract Data',
          text: messageHtml,
          attachments: [
            {
              // utf-8 string as an attachment
              filename: 'extract.csv',
              content: csvData
            },
]
          ]
        }, (err, info) => {
          if (err) {
            console.log('Error attempting to send email with CSV Extract: ' + err)
            reject(err)
          } else {
            console.log(`CSV extract email sent to: ${emailAddress} (AWS SES MessageId = ${info.messageId})`)
            return resolve(info)
          }
        })
      })
    })
}

1 个答案:

答案 0 :(得分:1)

首先,您的语法无效,您的代码将在运行时抛出。您只能在Promise实例上调用.then()。目前,您正在对不存在的对象调用方法。

Promise.all(arr).then(values => { 
   .then() // .then() of what exactly?
});

Promise.all使用一组Promise结果进行解析,这些结果作为参数传递。在你的情况下,这将是一个包含两个元素的数组,如:[moviesForCsvExport, actressesForCsvExport]。您可以在.then()回调中访问它们,如下所示:

Promise.all(arr).then((values) => {
  const movies = values[0];
  const actresses = values[1];
});

或使用数组解构更简洁的方式:

Promise.all(arr).then(([movies, actresses]) => {
  // movies and actresses will be available here
});

我建议您阅读Promise如何工作以及如何使用它们,因为您无法在不了解基础知识的情况下有效地使用它们。