Tengo un trabajo asíncrono dentro del bucle desde el lado del servidor:
const contacts = []; for(contact of contacts){ (async () => { await MailService.sendMessage(contact, 'message body') })() }Quiero romper ese bucle usando el lado del cliente, lo que hago es:
1 . desde el lado del servidor, antes de enviar el mensaje, verifique si el estado de la transmisión es en proceso o está detenido , si está detenido, entonces interrumpa el bucle.
2 . desde el lado del cliente, si quiero detener la transmisión (detener el bucle), necesito actualizar el valor de transmisión del proceso a detenido.
Entonces, mi código debería ser:
lado del servidor:
const contacts = []; for(contact of contacts){ (async () => { const currentBroadcast = await Broadcast.findById('id') if(currentBroadcast.status === 'stopped') break; await MailService.sendMessage(contact, 'message body') })() }lado del cliente:
document.getElementById('stop').addEventListener('click', () => { fetch('url/broadcast/stop/:id') })funciona. ¿Pero eso no haría que el servidor fuera pesado? Porque en cada ciclo tengo que verificar en la base de datos.
¿Hay alguna otra manera que pueda hacer para detener el bucle? sin tener que registrarse en la base de datos.
No necesita una base de datos para eso, solo necesita actualizar un valor que se puede ver en el código del servidor. Podría tener una ruta Express simple que agregue ID de sesión de cliente a una colección, que se actualiza cuando se llama a la ruta. Luego, simplemente haga que su bucle verifique si ese cliente envió dicha solicitud.
Con las sesiones , podría tener algo como, con una ruta:
const stoppedBroadcastSessionIds = new Set(); app.post('/stopbroadcast', function (req, res) { stoppedBroadcastSessionIds.add(req.session.id); })y luego hacer
for(const contact of contacts){ if (stoppedBroadcastSessionIds.has(req.session.id)) break; await MailService.sendMessage(contact, 'message body') }