우선 동기와 비동기가 무엇인지 알아볼 필요가 있다.
위에서 아래대로 순서대로 실행되는 흐름이다.
현재 실행 중인 코드가 완료된 후에 실행된다. 그 전까지는 blocking.
실행 중인 코드가 완료되지 않아도 다음 코드를 실행한다.
별도의 요청
, 실행 대기
, 보류
등과 같은 코드는 비동기적인 코드다.
eg) 이벤트 처리
, 서버 통신
등은 비동기적인 작업
싱글스레드
는 여러 태스크를 동시에 처리할 수 없기 때문에 비동기적으로 태스크를 처리해 오래걸리는 작업을 기다리지 않고 다음 작업을 먼저 수행하는 것이다. 때문에 실행 순서가 보장되지 않는다.callback
을 사용한다.매개변수로 다른 코드의 인자로 넘겨주는 함수이다.
매개변수로 함수를 받는 함수는 High-Order Function
이다.
콜백 함수를 넘겨받은 코드는 들어온 콜백 함수를 내부 로직에 의해 콜백 함수를 적절한 시점에 시행하게 된다.
콜백 지옥 은 콜백 함수를 익명 함수로 전달되는 과정을 반복해서 코드 들여쓰기가 감당하기 힘들정도로 깊어지는 현상을 의미한다. 이는
가독성
과유지보수
측면에서 좋지 않다
promise
는 비동기작업을 완료 또는 실패를 나타내는 객체이다.
promise 객체
는 아래와 같은 내부 프로퍼티를 갖게 된다.
pending(대기)
: resolve 또는 reject할지 결정 전인 상태fullfilled(이행)
: 요청이 성공적으로 완료된 상태rejected(거부)
: 요청이 실패한 상태상태들은 비동기 호출과 동시에 받는다. 대기중인 promise는 이행하거나 거부될 수 있다. 이후 상태에 따라 promise를 후속 처리하는 메서드가 있다.
.then
: 2개의 콜백 함수를 인자로 전달받는다. 첫번째 콜백함수는 성공 시 호출되고, 두번째 콜백 함수는 실패 시 호출된다.
.catch
: 비동기 처리에서 에러가 발생하는 경우 호출된다. promise를 반환한다.
chaining : .then
과 .catch
와 같이 promise를 후속 처리하는 메서드들은 다시 promise 메서드를 호출할 수 있는 것을 의미한다.
promise는 2개로 나누어진 큐 중, microTask에서 핸들링이 된다.
우선순위는 micro > task 순서이다.
promise가 한개 이상인 경우
Promise.all([apiRequest(...), apiRequest(...), apiRequest(...)]).then(function(result) {
// API 결과 값이 배열로 나온다.
}, function(err) {
// 에러 처리
});
syntatic sugar
이다. try
를 사용하고, reject가 되면 catch
를 사용한다..finally()
메서드를 사용할 수 있다. .finally()
메서드 내부의 코드는 promise 상태에 관계없이 한번 실행된다.동기
: 위에서 아래대로 순서대로 실행되는 흐름이다. 어떤 코드가 실행되고 있다면 그 코드가 완료된 후에 실행된다.비동기
: 이벤트 처리나 서버 통신과 같은 작업을 말한다. 즉, 실행 중인 코드가 완료되지 않아도 다음 코드를 실행한다.옵저버 패턴 (디자인 패턴중 하나)에서 나온 개념으로, 객체의 상태에 변화(이벤트)가 발생했을 때 함수를 통해 전달하는 것을 콜백함수라고 한다.
JS에서 비동기 프로그래밍을 위해 callback을 사용한다.
보통 서버로 어떠한 요청을 보낼 때 응답을 기다리는동안 가만히 시간을 버리는 것이 아닌, 다른 작업을 함으로써 동기적인 코드에 비해 성능을 향상시킬 수 있는데, 이러한 이유 때문에 콜백함수를 사용하게 된다.
가독성
과 유지보수
측면에서 좋지 않다 => 이를 해결하기 위해 ES6에서는 Promise와 Generator, 그리고 ES2017에서는 async와 await이 나오게 된다.상태
를 3가지로 나타낸다. (pending, fulfilled, reject) 이 때문에 어떤 상태인지 쉽게 확인할 수 있다.