код выполняется правильно и выводит сообщение об успешном завершении на консоль, но не печатает в приложении - PullRequest
1 голос
/ 17 апреля 2019

Я пытаюсь отправить электронное письмо нескольким лицам, и я получаю адреса из пожарной базы и сохраняю их в массиве, называемом отделом электронной почты, затем я просматриваю массив и отправляю электронную почту на каждый адрес, код работает правильно и отправляет все электронные письма. Мой вопрос: где в коде напишите agent.add («все письма успешно отправлены») после отправки всех писем

function sendEmails(agent){
//ask for department number and subject and message
  var sub=agent.parameters.subject;
  var msg=agent.parameters.message;


  return getEmailsForDepartment(agent.parameters.departmentNO).then(function(){

    departmentEmails.forEach(function(email){
      return createMessagesForDepartment(sub,msg,email).then(()=>{
        console.log("email sent successfully");

      }).catch(()=>{
       console.log(`fail`);
      });

    })

  });
}// end of send emails

//this function to get all addresses from database 
function getEmailsForDepartment(numOFDepartment){

  var query = admin.database().ref("/"+departmentsNo[numOFDepartment]).orderByKey();
  return query.once("value").then(function(snapshot){
    snapshot.forEach(function(childSnapshot){
      departmentEmails.push(childSnapshot.child('email').val());
    });

  });

}


function createMessagesForDepartment(sub,msg,emailAdd){
  return new Promise((resolve,reject)=>{
    // i promise to send email
    const nodemailer = require('nodemailer');
    const transporter = nodemailer.createTransport({
      service: 'gmail',
      auth: {
        user: '****@gmail.com',
        pass: '****'
      }
    });
    var mailOptions = {
      from: '*****@gmail.com',
      //how to send for all emails in array
      to: emailAdd, //receiver email
      subject: sub,
      text: msg
    };


    transporter.sendMail(mailOptions, function (error, info) {
      if (error) {
        console.log(error);
        reject(error);
      } else {
        console.log('Email sent: ' + info.response);

        resolve('Email sent: ' + info.response);
      }
    });



  });


}//end of create message

Ответы [ 2 ]

0 голосов
/ 17 апреля 2019

Я бы сохранил счетчик количества писем, оставшихся для отправки. Инициализируйте этот номер с количеством электронных писем отдела. Тогда обратный вызов для каждого успешно отправленного электронного письма уменьшит этот номер. Когда обратный вызов обнаруживает, что количество сообщений, оставшихся для отправки, равно нулю, вы можете смело сообщать, что все сообщения отправлены.

return getEmailsForDepartment(agent.parameters.departmentNO).then(function(){

  // Initialize a counter here.
  let numberOfEmailsRemainingToSend = departmentEmails.length;

  departmentEmails.forEach(function(email){

    return createMessagesForDepartment(sub,msg,email).then(()=>{
      console.log("email sent successfully");

      // Decrement the counter here.
      if(!--numberOfEmailsRemainingToSend)) {
        // When the counter reaches zero, all tasks are complete.
        agent.add("all email sent successfully")
      } 

    }).catch(()=>{
      console.log(`fail`);
    });

  })

});
0 голосов
/ 17 апреля 2019

Функция agent.add() не работает как console.log(). Он не отправляет сообщение немедленно пользователю, и обычно вы можете отправить только одно сообщение пользователю. Так что я не ожидал, что он напечатает три раза.

Если вам нужно увидеть сообщение для каждого, создайте строку во время цикла и вызовите agent.add() один раз с этой созданной строкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...