November 16, 2021
콜백 챕터에서 언급한 문제를 다시 집어봅시다. 스크립트를 불러오는 것과 같이 순차적으로 처리해야 하는 비동기 작업이 여러 개 있다고 가정해 봅시다. 어떻게 해야 이런 상황을 코드로 풀어낼 수 있을까요?
프라미스를 사용하면 여러 가지 해결책을 만들 수 있습니다.
이번 챕터에선 프라미스 체이닝(promise chaining)을 이용한 비동기 처리에 대해 다루도록 하겠습니다.
프라미스 체이닝은 아래와 같이 생겼습니다.
new Promise(function(resolve, reject) {
setTimeout(() => resolve(1), 1000); // (*)
}).then(function(result) { // (**)
alert(result); // 1
return result * 2;
}).then(function(result) { // (***)
alert(result); // 2
return result * 2;
}).then(function(result) {
alert(result); // 4
return result * 2;
});
프라미스 체이닝은 result
가 .then
핸들러의 체인(사슬)을 통해 전달된다는 점에서 착안한 아이디어입니다.
위 예시는 아래와 같은 순서로 실행됩니다.
(*)
.then
핸들러가 호출됩니다. –(**)
.then
핸들러에 전달됩니다. – (***)
프라미스 체이닝이 가능한 이유는 promise.then
을 호출하면 프라미스가 반환되기 때문입니다. 반환된 프라미스엔 당연히 .then
을 호출할 수 있습니다.
한편 핸들러가 값을 반환할 때엔 이 값이 프라미스의 result
가 됩니다. 따라서 다음 .then
은 이 값을 이용해 호출됩니다.
초보자는 프라미스 하나에 .then
을 여러 개 추가한 후, 이를 체이닝이라고 착각하는 경우가 있습니다. 하지만 이는 체이닝이 아닙니다.
프론트 단에선, 네트워크 요청 시 프라미스를 자주 사용합니다. 이에 관련된 예시를 살펴봅시다.
예시에선 메서드 fetch를 사용해 원격 서버에서 사용자 정보를 가져오겠습니다. fetch
엔 다양한 선택 매개변수가 있는데 자세한 내용은 별도의 챕터에서 다루기로 하고, 여기선 기본 문법만 사용해 보겠습니다.