Моя проблема проста - иногда одно из писем не отправляется. Мой код:
api.post('/sendMail', (req, res) => {
transporter.sendMail(someFunc(), (err) => { // send mail to one user
if (err) {
res.status(500).send('error');
}
res.status(200).send('success');
});
transporter.sendMail(someFunc(), (err) => { // send mail to second user
if (err) {
res.status(500).send('error');
}
res.status(200).send('success');
});
});
как указано выше - иногда одно из писем не отправляется.
Вопрос: Должен ли код, отвечающий за отправку второй почты, находиться внутри обратного вызова первой почты? Или совершенно нормально держать их отдельно, как в приведенном выше коде? Спасибо!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Код, скорее всего, не сработает во многих случаях. Вы не можете заставить Express отвечать с двумя разными кодами состояния, вы должны решить однажды, какой код и ответ вы отправляете.
Should code responsible for sending second mail be inside callback of first mail ?
Да, это могло бы быть способом, однако у него есть два недостатка.
1) он плохо масштабируется (сделайте это для четырех, трех,... десяти тысяч писем...)
2) он плохо масштабируется с точки зрения производительности, так как при этом будет отправляться одно электронное письмо за другим, вместо этого вы можете отправлять их параллельно:
Для этого промисифицируйте отправку писем:
const sendMail = () => new Promise((resolve, reject) => {
transporter.sendMail(someFunc(), (err) => {
if (err) reject(err) else resolve();
});
});
Тогда это так же просто, как:
Promise.all([ sendMail(), sendMail() ])
.then(() => res.status(200).send("success"));
.catch(() => res.status(500).send("failure"));