Web Worker: способ запуска скриптов в фоновом режиме в другом потоке, отличном от текущего основного (Window) потока.
JavaScript обычно обрабатывает асинхронные операции, помещая задачи в соответствующие очереди (очередь макрозадач, очередь микрозадач), при этом цикл событий постоянно проверяет эти очереди и помещает задачи в стек вызовов, когда они готовы к выполнению. Этот подход обеспечивает неблокирующее выполнение, но при этом все выполняется в одном потоке.
Веб-воркеры, с другой стороны, позволяют сценариям выполняться в совершенно отдельном потоке с собственным стеком вызовов, асинхронными очередями и циклом событий. Такое разделение предотвращает блокировку основного потока тяжелыми вычислениями или длительными задачами, поскольку рабочий процесс работает независимо.
Веб-работники выполняют сценарии в контексте, отличном от контекста главного окна, что обеспечивает параллелизм в веб-приложениях. API веб-воркеров предоставляет несколько типов воркеров:
Эта статья посвящена специальным работникам, которые наиболее просты в реализации и широко используются.
Чтобы создать веб-воркер, вы можете использовать следующие ключевые методы:
Давайте создадим рабочий процесс для получения данных из API, в частности изображений собак из API Dog CEO.
Вот реализация рабочего скрипта. Обратите внимание, что внутри работника self используется для ссылки на глобальный контекст:
if (window.Worker) { const worker = new Worker("/src/worker.js"); worker.postMessage({ operation: "get_dog_imgs", url: "https://dog.ceo/api/breeds/image/random", count: 5 //number of photos }); worker.onmessage = (e) => { console.log(e.data); if (e && e.data) { setdata((old) => [...old, e.data]); // update react state showCallStack(); // function to show the callstack } }; worker.onerror = (e) => { console.log(e); }; }
В этом коде исполнитель прослушивает сообщения (onmessage) и извлекает данные с заданного URL-адреса несколько раз, как указано счетчиком.
Вот как выглядит стек вызовов внутри работника:
Основной поток использует рабочий процесс следующим образом:
self.onmessage = (event) => { const data = event.data; if (data && data.url && data.count) { fetchFromUrls(data.url, data.count); } } // fetch single data const fetchdata = async (url) => { const res = await self.fetch(url); return await res.json(); }; const fetchFromUrls = async (url, count) => { showCallStack(); // showing the callstack of the worker for (const i of new Array(count).fill(0)) { let data = await fetchdata(url); if (data && data.message) { self.postMessage({ type: "img", data: data.message }); } } };
Этот код демонстрирует, как отправить сообщение работнику и получить полученные данные в основном потоке.
полный код см. в коде
Хотя веб-работники выполняются в потоке, отдельном от потока главного окна, они имеют определенные ограничения:
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3