자바스크립트 코드를 백그라운드에서 실행시키기 위한 기술로 다른 말로는 스레드라고도 부른다. 기존 웹표준에서는 멀티 스레드가 지원되지 않았는데, 이러한 멀티 스레드의 역할을 웹 워커가 담당하면서 별개의 백그라운드 처리가 가능해졌다.
(멀티 스레드란: 여러 작업을 동시에 수행하는 것)
var worker = new Worker("worker.js")
worker.postMessage(메세지);
// postMessage() 메소드에 메세지를 전달인즈로 넘기며, 이 메세지는 워커로 전달되다.
onmessage = function(event) {
event.data;
postMessage(메세지);
}
postMessage() 메소드에 의해 전달된 메세지를 event로 받고, postMessage()를 통해 메세지를 전달한 곳으로 다시 전달 가능
<이미지>
HTML5 메인 문서와 웹워커 사이에 postMessage() 메소드를 통해서 서로 양방향 메세지를 주고 받을 수 있다.
onerror = function(error){
오류에 관한 정보 출력
}
index.html
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>바닐라로 워커 스레드 만들기</title>
</head>
<body>
<button onclick="stopOperation()">워커 미적용 수행</button>
<button onclick="applyWorker()">워커 수행</button><p></p>
<button onclick="awake()">깨어날 시간</button><p></p>
<button onclick="killWorker()">워커 종료</button><p></p>
<button onclick="closeWorker()">워커 내부 종료</button>
<p></p>
<div id="result"></div>
<script src="index.js"></script>
</body>
</html>
index.js
const result = document.getElementById("result");
// function stopOperation() {
// const endTime = new Date().getTime() + 5000; // 현재시간보다 5초 뒤
// while (new Date().getTime() < endTime); // 현재 시간이 5초뒤를 가리키는 endTime보다 작을 때 true
// result.innerHTML = "";
// result.innerHTML = "일어날 시간입니다.";
// }
function awake() {
alert("얘기야 가자");
}
// 워커 사용
function applyWorker() {
if (window.Worker) {
worker = new Worker("worker.js");
worker.postMessage("일어나, 일어나라고!!!");
worker.onmessage = function (event) {
result.innerHTML = event.data;
};
worker.onerror = function (e) {
result.innerHTML += `${e.message}가 발생했습니다.`;
result.innerHTML += `${e.filename}에서 에러가 발생했습니다.`;
result.innerHTML += `${e.lineno}에서 에러가 발생했습니다.`;
};
} else {
result.innerHTML = "동작 실패 ㅠㅠ";
}
}
function killWorker() {
worker.terminate();
result.innerHTML = "워커 종료";
}
function closeWorker() {
worker.postMessage("close");
}
worker.js
function stopOperation() {
const endTime = new Date().getTime() + 5000; // 현재시간보다 5초 뒤
while (new Date().getTime() < endTime); // 현재 시간이 5초뒤를 가리키는 endTime보다 작을 때 true
}
onmessage = function (event) {
const receiveMsg = event.data;
stopOperation();
const sendMsg = receiveMsg + "백그라운드에서 동작합니다.";
this.postMessage(sendMsg);
};