😊자바스크립트는 다른 멀티스레드 프로그래밍 언어와 다르게 싱글 스레드 환경에서 비동기 동작을 처리한다. 싱글 스레드 비동기 환경을 구성하는 중요 요소 중 하나인 이벤트 루프에 대해 이해하면, js엔진 레벨에서의 비동기 코드 동작을 이해할 수 있다.
자바스크립트 엔진은 하나의 메인 스레드로 구성된다.
메인 스레드가 코드를 읽어서 한 줄씩 실행한다. 브라우저 환경에서는 유저 이벤트를 처리하고 화면을 그린다.
멀티스레드 언어 : 예)JAVA
10초 뒤에 실행되는 setTimeOut() 메서드를 만나면 새로운 또 하나의 스레드를 열고 그 멀티스레드는 10초동안 아무 동작도 하지 않고 기다리다가 10초 뒤에 동작하고 소멸한다.
싱글스레드 언어 : 예)javascript
10초 뒤에 실행되는 setTimeout()메서드를 읽으면 외부 Web API에서 10초 기다리다가 10초 후 실행이 되고 task Queue로 이동되어 메서드 저장이 되어있다가 하나뿐인 메인 스레드가 task Queue에서 저장되어 있던 setTimeout()메서드를 가지고 와서 실행을 한 후 소멸이 된다.
자바스크립트 엔진은 비동기 처리를 제공하지 않는다. 대신 비동기 코드는 정해진 함수를 제공하여 활용할 수 있는데 이 함수들을 'API' 라고 한다.
비동기 API 의 예시로, setTimeout, XMLHttpRequest, fetch 등의 Web API가 존재한다.
node.js의 경우 파일처리API, 암호화API등을 제공한다.
//타이머 비동기 처리
setTimeout(() => console.log('타이머 끝'), 1000);
setInterval(() => console.log('인터벌 타이머'), 1000);
//네트워크 처리
fetch('https://google.com')
.then(() => console.log('네트워크 요청 성공'))
.catch(() => console.log('네트워크 요청 실패'));
비동기 코드를 처리하는 모듈은 js엔진 외부에 있다.
따라서 js코드는 js엔진 외에도 api모듈, 비동기코드를 처리하는 모듈 등이 함꼐 동작한다.
👌이벤트 루프는 콜 스택이 비워지는 것을 기다렸다가, 태스크 큐에서 콜백함수가 들어온 순서대로 함수를 꺼내 콜스택에 넣는다.
👌queue는 여러 개가 존재하며 그 중 우선 순위가 높은 큐 (job queue 등)에서 나중에 들어온 콜백함수가 실행될 수 있다.
비동기API중 하나이다.
task queue가 아닌 job queue(task queue보다 우선순위가 높음!!)를 사용한다.
let promise = new Promise((resolve, reject) => {
if (Math.random() < 0.5) {
return reject('실패');
}
resolve(10);
})```
* new Promise(callback)
* callback함수는 (resolve, reject) 두 인자를 받는다.
* Promise가 성공했을 때 → resolve를 호출하여 10을 찍는다.
* Promise가 실패했을 때 → reject를 호출하며 '실패'가 찍힌다.
😊Promise API를 사용하면 비동기 처리에 의한 성공, 실패를 설정하여 확인 할 수 있다.
## promise 메서드 ( then, catch, finally)
``` js
promise.then(data => { //.then() 메서드에 성공시 실행할 콜백함수를 인자로 넘김
console.log('성공: ', data);
})
.catch(e => { //.catch() 메서드에 실패시 실행할 콜백 함수를 인자로 넘김
console.log('실패: ', e);
})
.finally(() => { //.finally()메서드는 성공/실패 여부와 상관없이 모두 실행할 콜백함수를 인자로 넘김
console.log('promise종료');
})
.then(cb1, cb2)
로 cb1의 자리에 성공, cb2의 자리에 실패 메서드를 인자로 넘길 수 도 있다.new Promise()
, .then()
끝에는 return this;
가 생략되어 있는것인위적으로 Promise method chain을 만들 수 있어서, 비동기 코드로 진행해야 하는 상황 등에 유용하게 사용할 수 있다.
성공한 Promise를 바로 반환한다.
Promise.resolve(10).then(console.log);
이 함수는 실패한 Promise를 바로 반환한다.
Promise.reject('Error').catch(console.log);
Promise.all([promise1, promise2, promise3])
.then(values => {
console.log('모두 성공:', values)
})
.catch(e => {
console.log('하나라도 실패: ', e)
})
pending
: 성공/실패 하기 전 진행 상태
setteld
: 성공(resolved, fulfilled) / 실패(rejected) 상태를 묶어서 이르는 말