Javascript async / await: неопределенная ошибка при чтении файла - PullRequest
0 голосов
/ 23 октября 2018

Я пытаюсь отправить электронное письмо с помощью цикла for, используя async/await.

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-файл из файла и отправить его в функцию mail.

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

но я получаю undefined на console.log(emailTemplate);, еще один вопрос, как я могу убедиться, что sendEmailNotification выполняется один за другим в каждом состоянии цикла for ??

1 Ответ

0 голосов
/ 23 октября 2018

fs.readFile не поддерживает async/await.Но вы можете создать версию, которая будет:

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 ??

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