Javascript异步/等待:文件读取时出现未定义错误
我正在尝试使用Javascript异步/等待:文件读取时出现未定义错误,javascript,node.js,async-await,file-read,Javascript,Node.js,Async Await,File Read,我正在尝试使用async/await发送带有for循环的电子邮件 const prepareNotification =(genie)=>{ genie.forEach(async (item)=>{ if(item.is_active){ if(item.is_email){ sendEmailNotification(item); } }else{
async/await
发送带有for循环的电子邮件
const prepareNotification =(genie)=>{
genie.forEach(async (item)=>{
if(item.is_active){
if(item.is_email){
sendEmailNotification(item);
}
}else{
console.log('deal genie inactive for',item.name);
}
});
}
对于发送,我需要从文件中读取HTML并发送到邮件功能
const sendEmailNotification=async (item)=>{
try{
let emailTemplate = await fs.readFile(__basedir+'/controllers/html/sharedeal.html','utf-8');
console.log(emailTemplate);
let replacements = {
dealLink:'testlinkhere'
};
let mailOptions = {
from: process.env.smtpEmail,
to: item.email,
subject: 'DealLink',
replacements:replacements,
template:emailTemplate
};
let mail = await sendEmail(mailOptions);
}catch(error){
console.log(error);
}
}
但是我在
console.log(emailTemplate)上得到了undefined
,还有一个问题,我如何确保在for循环中的每个状态上依次执行sendEmailNotification
。但您可以创建一个具有以下功能的版本:
const util = require('util');
const readFileAsync = util.promisify(fs.readFile);
然后
let emailTemplate = await readFileAsync(__basedir+'/controllers/html/sharedeal.html','utf-8');
console.log(emailTemplate);
我如何确保sendEmailNotification在for循环中的每个状态上都一个接一个地执行 或
Array.forEach
不支持async
。或者,如果您想以另一种方式看到这一点,它不支持承诺作为回调响应。您需要执行有序异步循环或类似操作,否则它将无法工作。此外,您应该执行等待sendEmailNotification
,否则异步将毫无用处。因此,我需要在异步库中使用类似于瀑布
的方法。无论您将要使用什么,都可以通过执行简单的递归循环来实现:。您是否承诺了fs.readFile
?它通常不返回承诺。事实上,fs.readFile是同步的,除非得到承诺…它工作正常。顺便问一下,你对我的最后一句话有什么建议吗?没有必要从sendmailnotification
?@iambatman返回承诺它已经返回了promise
,这是一个异步函数。
const prepareNotification = async (genie) => {
for (let item of genie) {
if(item.is_active){
if(item.is_email){
await sendEmailNotification(item);
}
}else{
console.log('deal genie inactive for', item.name);
}
}
}
const prepareNotification = (genie) => {
genie.reduce((prev, item) => {
if(item.is_active){
if(item.is_email){
return prev.then(() => sendEmailNotification(item));
}
}else{
console.log('deal genie inactive for', item.name);
}
return prev;
}, Promise.resolve());
}