비동기 함수
: 함수 내부에 비동기로 동작하는 코드를 포함한 함수
- 비동기 함수 호출 시, 함수 내부의 비동기 코드가 완료되지 않아도 즉시 종료
- 함수가 종료된 이후에 완료
- 함수 내부의 비동기 코드의 처리 결과를 외부로 반환 or 상위 스코프 변수에 할당할 경우, 기대한 대로 동작하지 않음
-> 비동기 함수의 처리 결과(서버의 응답 등)에 대한 후속 처리는 비동기 함수 내에서 수행해야 함- 비동기 함수에 비동기 처리 결과에 대한 후속처리를 수행하는 콜백 함수 전달하는 것이 일반적
try {
setTimeout(() => { throw new Error('Error!'); }, 1000);
} catch(e) {
// setTimeout의 콜백 함수에서 발생한 에러를 캐치하지 못한다.
console.error('캐치한 에러', e);
}
const promise = new Promise((resolve, reject) => {
if(/* 비동기 처리 성공 */) {
resolve('result');
} else { /* 비동기 처리 실패 */
reject('failure reason');
}
});
new Promise(resolve => resolve('fulfilled'))
.then(v => console.log(v), e => console.log(e)); // fultilled
then(undefined, onRejected)
와 동일하게 동작new Promise((_, reject) => reject(new Error('rejected')))
.catch(e => console.log(e)); // Error: rejected
then
의 두 번째 콜백 함수 or catch
로 에러 처리 가능catch
메서드에서 하는 것이 가독성이 좋고 명확함 const url = 'https://...';
// 프로미스 체이닝 이용
promiseGet(`${url}/posts/1`)
.then(({ userId }) => promiseGet(`${url}/users/${userId}`))
.then(userInfo => console.log(userInfo))
.catch(err => console.log(err));
// async/await 이용
(async () => {
const { userId } = await promiseGet(`${url}/posts/1`);
const userInfo = await promiseGet(`${url}/users/${userId}`);
console.log(userInfo);
})();
const resolvedPromise = Promise.resolve([1, 2, 3]);
resolvedPromise.then(console.log); // [1, 2, 3]
// 위 예제와 동일하게 동작
const resolvedPromise = new Promise(resolve => resolve([1, 2, 3]));
resolvedPromise.then(console.log); // [1, 2, 3]
const requestData1 = () => new Promise(resolve => setTimeout(() => resolve(1), 3000));
const requestData2 = () => new Promise(resolve => setTimeout(() => resolve(2), 2000));
const requestData3 = () => new Promise(resolve => setTimeout(() => resolve(3), 1000));
Promise.all([requestData1(), requestData2(), requestData3()])
.then(console.log) // [1, 2, 3]
.catch(console.error);
Promise.all
과 비슷하나 가장 먼저 fulfilled 상태가 된 프로미스의 처리 결과를 새로운 프로미스를 통해 반환XMLHttpRequest
객체와 마찬가지로 HTTP 요청 전송 기능을 제공하는 클라이언트 사이드 Web API