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

Я нашел много вопросов, связанных с этим, но я не могу понять, как решить мою конкретную проблему.

У меня есть функция, которая получает электронную почту пользователей и отправляет им электронные письма. После каждого отправленного письма я добавляю соответствующий идентификатор пользователя в массив. Сейчас я использую регистратор, поэтому мне нужно сохранить в журнале количество отправленных писем, для этого мне просто нужно получить длину массива.

Проблема в том, что это асинхронно, как я могу получить длину массива только после отправки писем всем пользователям?

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.

1 Ответ

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

Вы можете легко вернуть счет из этой функции.

return new Promise(resolve => {
            let emailCount = 0;
            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);
                        emailCount++                                
                    }
                });  
                resolve(emailCount);
            }
        });
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...