Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript异步/等待:文件读取时出现未定义错误_Javascript_Node.js_Async Await_File Read - Fatal编程技术网

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