JavaScript — это однопоточный язык, используемый им поток называется основным потоком
Брауэр на самом деле использует другие темы
Веб-воркер из API браузера — это способ создавать и регистрировать дополнительные потоки с помощью JavaScript
Предположим, вам нужно вычислить много данных, чтобы построить диаграмму.
Эти вычисления могут занять достаточно много времени, и страница перестанет отвечать на запросы
Вот тут-то и приходит на помощь веб-работник.
Вы можете создать новый поток для вычисления этих данных, и когда это будет сделано, веб-работник сможет отправить результат обратно в основной поток
В этом примере я собираюсь использовать Web Worker для получения API изображений собак и отправки результата обратно в основной поток для отображения этих изображений
"use client"; import { ChangeEvent, MouseEvent, useCallback, useEffect, useRef, useState } from "react"; export default function Home() { const [userInput, setUserInput] = useState(""); const workerRef = useRef (); const [dogPics, setDogPics] = useState (); useEffect(() => { workerRef.current = new Worker(new URL("./worker.ts", import.meta.url)); workerRef.current.onmessage = (event: MessageEvent ) => setDogPics(event.data); return () => { workerRef.current?.terminate(); }; }, []); const handleUserInputChange = useCallback( (e: ChangeEvent ) => { setUserInput(e.target.value); }, [setUserInput] ); const handleFetch = useCallback( (e: MouseEvent ) => { userInput && workerRef.current?.postMessage(userInput); }, [userInput] ); return ( {dogPics && dogPics.map((pic) =>); })}
self.onmessage = async (e: MessageEvent) => { const url = `https://dog.ceo/api/breeds/image/random/${e.data}`; const response = await fetch(url).then((res) => res.json()); self.postMessage(response.message); };
Теперь запустите приложение и проверьте результат!
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3