node.js를 공부하면서 비동기 처리에 대해서 배우게 되었습니다. 비동기 처리란 특정 연산이 끝날 때까지 기다려주지 않고 다음 코드를 먼저 실행하는 것을 말합니다.
Promise에는 resolve와 reject 메서드가 존재합니다. resolve는 요청을 수행할 수 있을 때 실행됩니다. 이때 'then'이 존재할 경우 then을 실행합니다. reject는 요청을 수행할 수 없을 때 실행됩니다. 이때 'catch'가 존재할 경우 catch를 실행합니다.
위의 특성 때문에 promise와 같은 비동기 처리를 설명할 때 실행은 바로 하고, 결과는 나중에 받는 것이라고 말하기도 합니다. 이유는 코드를 먼저 실행하고 요청에 따라 then과 catch를 통해 결괏값을 반환받기 때문입니다.
먼저, resolve를 사용한 예제에 대해서 알아보겠습니다.
const resolvePromise = Promise.resolve('성공');
resolvePromise
.then((value => {
console.log(`resolvePromise: ${value}`)
}));
Promise의 resolve에 '성공'을 변수로 넘겨주면 .then의 value에 값이 넘어가서 콘솔을 통해 값을 출력하면 다음과 같습니다.
resolvePromise: 성공
다음은 Promise의 매개변수로 배열을 넘겨보는 예제입니다.
const arrayPromise = Promise.resolve(['이렇게', '배열로', '받을 수 있다.', 3]);
arrayPromise
.then((values => {
for (const value of values) {
console.log(`arrayPromise[${values.indexOf(value)}]: ${value}`);
}
}));
첫번째 예제와 마찬가지로 values에는 ['이렇게', '배열로', '받을 수 있다.', 3]가 저장되게 됩니다. 따라서 for문을 통해 출력하면 콘솔의 결과는 다음과 같습니다.
arrayPromise[0]: 이렇게
arrayPromise[1]: 배열로
arrayPromise[2]: 받을 수 있다.
arrayPromise[3]: 3
다음은 reject를 사용한 예제입니다.
Promise의 reject에 '실패'라는 매개변수를 넘겨주면. catch의 error에 '실패' 값이 넘어가게 됩니다.
const rejectPromise = Promise.reject('실패');
rejectPromise
.catch((error) => {
console.error(`rejectPromise: ${error}`);
})
코드 실행결과는 다음과 같습니다.
rejectPromise: 실패
다음은 reject에 then을 선언했을 경우 어떤 식으로 동작하는지 확인하는 예제입니다.
const rejectFuncPromise = Promise.reject('실패로 간다.');
rejectFuncPromise
.then((value => {
console.log('호출되지 않음');
}))
.catch((error) => {
console.log(`rejectFuncPromise: ${error}`);
});
reject는 요청을 수행할 수 없는 경우에 catch를 실행시켜줍니다. 따라서 .then의 코드는 실행되지 않고, 바로 catch를 실행시켜줍니다. 코드 실행의 결과는 다음과 같습니다.
rejectFuncPromise: 실패로 간다.
다음은 Promise 안에 Promise를 생성하여 reject가 두번 실행되는 예제입니다.
const doubleRejectPromise = Promise.reject();
doubleRejectPromise
.catch(() => {
console.error('첫번째 실패');
return new Promise((resolve, reject) => {
reject('두번째 실패');
});
})
.catch((error) => {
console.error(error);
});
reject를 설장하여 catch를 실행하지만 첫번째 실패가 출력된 후에 Promise를 return 해줍니다. Promise 안에서 Promise를 return 하게 되면 다음 catch로 이동하여 매개변수로 받은 error를 출력하게 됩니다. 코드 실행 결과는 다음과 같습니다. (🧨 중첩 Promise는 resolve에서도 사용이 가능합니다.)
첫번째 실패
두번째 실패
마지막은 Promise 객체를 new로 생성하여 resolve와 reject를 동시에 처리하는 예제입니다.
const condition = true;
const resolveRejectPromise = new Promise((resolve, reject) => {
if (condition) {
resolve('성공');
} else {
reject('실패');
}
});
resolveRejectPromise
.then((value => {
console.log(`resolveRejectPromise: ${value}`);
}))
.catch((error) => {
console.error(`resolveRejectPromise: ${error}`);
});
condition의 값에 따라 요청 수행 여부를 결정하여 resolve와 reject를 실행시켜줍니다. 위의 코드에서 condition의 값이 true이므로 resolve에 '성공'이라는 값을 넘겨줍니다. 따라서 resolveRejectPromise의 then 코드가 실행되게 됩니다. 코드 실행의 결과는 다음과 같습니다.
resolveRejectPromise: 성공
'Java, JavaScript > Node' 카테고리의 다른 글
[Node] 비동기 처리 - async/await (0) | 2021.10.14 |
---|---|
[Node] http 모듈을 사용하여 간단한 API 만들기 (0) | 2021.10.01 |