Я нашел много вопросов, связанных с этим, но я не могу понять, как решить мою конкретную проблему.
У меня есть функция, которая получает электронную почту пользователей и отправляет им электронные письма.
После каждого отправленного письма я добавляю соответствующий идентификатор пользователя в массив.
Сейчас я использую регистратор, поэтому мне нужно сохранить в журнале количество отправленных писем, для этого мне просто нужно получить длину массива.
Проблема в том, что это асинхронно, как я могу получить длину массива только после отправки писем всем пользователям?
async function asyncForEach(array, callback) {
for (let index = 0; index < array.length; index++) {
await callback(array[index], index, array);
}
}
const waitFor = (ms) => new Promise(r => setTimeout(r, ms));
var sentMail = [];
module.exports = {
sendReminderMail: function(db, mail, consts){
db.find({ $and: [{ subscribed: true }] }, { $not: { feedback: true } }] }, async (err, result) => {
if (err) {
logger.error(`${err.status || 500} - ${err} - '/sendReminderMail' - 'Schedule'`);
} else {
await asyncForEach(result, async (subscriber, index) => {
await waitFor(2000 * index);
if (sentMail.indexOf(subscriber._id) < 0) {
mail.sendMail(subscriber, consts.emailType.REMINDER);
sentMail.push(subscriber._id);
}
});
}
});
}
}
Я пробовал это, но в этом случае регистратор вызывается после каждого взаимодействия:
const waitFor = (ms) => new Promise(r => setTimeout(r, ms)).then(
logger.info(sentMail.length + 'mails was sent'));
Предположим, что мой sentMail
массив - это [123, 987,2545]
, поэтому мой регистратор должен сохранить 3 mails were sent
.