Как остановиться node.js функции/цикл по запросу

#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 Что сейчас за цикл ура?