이벤트 루프
Q. 실행 결과 예측해보기
function onMore(){
console.log("one more");
};
function run(){
console.log("run run");
setTimeoute(()=>{
console.log("wow")
},0)
new Promise((resolve)=>{
resolve("hi")
}).then(console.log);
onMore();
}
setTimeout(run,5000);
- 호출 스텍
- 백그라운드
- 태스크 큐
setTimeout은 백그라운드에서 처리되는 비동기 함수이다. 백그라운드 영역에서는 input 순서 없이 처리가 끝나는 대로 결과를 테스크 큐로 옮긴다.
태스크 큐는 호출 스택이 비어져있을 때 실행된다.
Promise에 then이 붙을 때 비동기 처리가 된다.
Promise란?
콜백 헬이라고 불리는 지저분한 자바스크립트 코드의 해결책이 될 수 있다
: 내용이 실행은 되었지만 결과를 아직 반환하지 않은 객체
then을 붙이면 결과를 반환한다.
resolve(value) — 일이 성공적으로 끝난 경우 그 결과를 나타내는 value와 함께 호출
reject(error) — 에러 발생 시 에러 객체를 나타내는 error와 함께 호출
요약하면 다음과 같습니다. executor는 자동으로 실행되는데 여기서 원하는 일이 처리됩니다. 처리가 끝나면 executor는 처리 성공 여부에 따라 resolve나 reject를 호출합니다.
let promise = new Promise(function(resolve, reject) { // executor (제작 코드, '가수') });
then이란?
let promise = new Promise(function(resolve, reject) { setTimeout(() => reject(new Error("에러 발생!")), 1000); }); // reject 함수는 .then의 두 번째 함수를 실행합니다. promise.then( result => alert(result), // 실행되지 않음 error => alert(error) // 1초 후 "Error: 에러 발생!"를 출력 );
.then의 첫 번째 인수는 프라미스가 이행되었을 때 실행되는 함수이고, 여기서 실행 결과를 받습니다.
.then의 두 번째 인수는 프라미스가 거부되었을 때 실행되는 함수이고, 여기서 에러를 받습니다.
A. run run -> one more ->hi[백그라운드]-> wow[백그라운드]
논블로킹 vs 블로킹
논블로킹 | 블로킹 |
---|---|
이전 작업이 완료될 때까지 대기하지 않고 다음 작업을 수행함 | 작업이 끝나야만 다음 작업을 수행함 |
논블로킹 처리
setTimeout(콜백,0) // 하지만 논블로킹과 동시가 같은 의미가 아니다.