Как я могу приостановить или отменить L oop в NodeJs от Angular клиента - PullRequest
0 голосов
/ 03 мая 2020

Мне интересно, можно ли отменить или приостановить все действия oop, которые выполняются в NodeJs. В моем случае у меня есть функция, которую пользователь вызывает через клиент angular и отправляет письмо списку людей. В NodeJs есть функция, которая перебирает список и отправляет электронное письмо. Я также обеспечил прогресс через socket.io, который все прекрасно работает. Вопрос в том, есть ли способ прервать, отменить этот l oop с клиента, как только он будет запущен. Ниже приведен мой код, который я сейчас использую для обновления клиента прогресса и c.

campRoutes.post('/sendEmail/:socketid?', token_check, async(req, res) => {
    try {
        // Get Socket info
        const socketid = req.params.socketid

        let emails

        if (req.body.massEmailType == 'Farm') {
            emails = await bulk.getEmails(req.body.tractList)
            let recCount = emails[0].length
            // Calculate the delay timer based on record count

            // If the client send SocketID we will update via socket
            if (socketid) {
                console.log(socketid)
                io.to(`${socketid}`).emit('emailCount', {count: recCount})
            }

            let i = 1
            while (i <= recCount){

            if (socketid) {
                //TODO: Add Email Send Code
                io.to(`${socketid}`).emit('emailProcessed', {count: i})
                io.to(`${socketid}`).emit('massEmailSend', {name : emails[0][i-1].name , address :emails[0][i-1].address})
                console.log('Sending Message ' + emails[0][i-1].address)
                i++
                await sleep(150)
            }

            }

        }


        res.json({ Success: true , Error: "", Message:"", Data:emails})

    } catch (error) {
        console.log(error)
        res.json({ Success: false , Error: error.Error, Message:error.Error})  

    }

})

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

Пока я решил эту проблему, не используя socket.io для остановки l oop, но http.get

  • я создал на своем контроллере массив mailStop, который пользователь вызывает для вызова Mail L oop function
  • после вызова пользователем функции, которую я возвращаю через socket.io mailingID, который затем устанавливается на клиенте angular.
  • , если пользователь нажимает кнопку stop, процесс вызывает вызов в api и pu sh mailingID в массиве mailStop.
  • В моем l oop я проверяю, находится ли mailingID в массиве mailStop и выходит ли он из l oop.
  • Для правильного ведения домашнего хозяйства я удаляю mailingID из массива mailStop

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

Единственное, что было бы замечательно, - это найти способ, как установить это сообщение от клиента к серверу через socket.io

0 голосов
/ 03 мая 2020

Если это все oop, я полагаю, вы можете прослушать SIGTERM для своего специфика c pid, используя

process.on('SIGTERM', () => {...

Техника, документированная в https://hackernoon.com/graceful-shutdown-in-nodejs-2f8f59d1c357

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