#javascript #node.js
Вопрос:
Я работаю на сервере fastify, и когда я отправляю запрос, я получаю массу данных от mongodb и запускаю цикл for для обработки каждого элемента. Это может занять ~ 30 минут. Каждый элемент «обрабатывается» путем отправки в ffmpeg, redis pub->sub, а затем в сокет клиенту.
// Streams controller
exports.renderStreams = async function (req, reply) {
const streams = await Stream.find({}).sort({ createdAt: -1 })//.limit(5)
const renderedStreams = renderStreams(this, streams);
return { success: true, streams: streams.length };
}
// renderStreams
const renderStreams = (fastify, streams = []) => {
const { redis } = fastify;
const channel = "streams";
for (let i = 0; i < streams.length; i ) {
setTimeout(async () => {
const stream = streams[i];
await renderStream(redis, channel, stream);
}, i * 200)
}
}
Мне интересно, в этом цикле for, как я могу либо «приостановить» его, либо полностью остановить (или и то, и другое?) по другому запросу, может быть, когда я позвоню /api/streams/stop
.
Как это было бы возможно?
Ответ №1:
Вы можете использовать сокет.ввод-вывод для связи с вашим сценарием, пока он все еще работает, поэтому вы создадите функцию для остановки цикла и получения уведомления от сокета.ио ты бы его запустил. Ссылка на документацию: https://socket.io/docs/v4/
Комментарии:
1. Хорошо, эта часть работает, однако как бы выглядел код, чтобы «остановить» или «приостановить» его? Я имею в виду, что я понимаю часть розетки.
2. @kinx Что сейчас за цикл ура?