我有两个返回函数(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)
}
})
})
})
}
答案 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如何工作以及如何使用它们,因为您无法在不了解基础知识的情况下有效地使用它们。