비동기 함수
비동기 함수의 비동기 처리
let g = 0;
setTimout(() => { g = 100; }, 0);
console.log(g); // undefined
get('/step1', a => {
get(`/step2/${a}`, b => {
get(`/step3/${b}`, c => {
get(`/step4/${c}`, d => {
console.log(d);
});
});
});
});
try {
setTimeout(() => { throw new Error('Error!'); }, 1000);
} catch (e) {
// 에러 캐치 X
console.error('캐치한 에러', e);
}
const promise = new Promise((resolve, reject) => {
// Promise 함수의 콜백 함수 내부에서 비동기 처리를 수행함
if (/* 비동기 처리 성공 */) {
resolve('result');
} else {
/* 비동기 처리 실패 */
reject('failure reason');
}
});
상태 | 의미 | 구현 |
---|---|---|
pending | 비동기 처리가 아직 수행되지 않은 상태 | 플로미스가 생성된 직후 기본 상태 |
fufilled | 비동기 처리가 수행된 상태 (성공) | resolve 함수가 호출된 상태 |
rejected | 비동기 처리가 수행된 상태 (실패) | reject 함수가 호출된 상태 |
settled | 비동기 처리가 수행된 상태 (성공 또는 실패) | resolve 또는 reject 함수가 호출된 상태 |
// fufilled
new Promise(resolve => resolve('fufilled'))
.then(v => console.log(v), e => console.error(e)); // fulfilled
// rejected
new Promise((_, reject) => reject(new Error('rejected')))
.then(v => console.log(v), e => console.error(e)); // Error: rejected
// rejected
new Promise((_, reject) => reject(new Error('rejected')))
.catch(e => console.log(e)); // Error: rejected
new Promise(() => {})
.finally(() => console.log('finally')); // finally
coonst promiseGet = url => {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.open('GET', url);
xhr.send();
xhr.onload = () => {
if (xhr.status === 200) {
resolve(JSON.parse(xhr.response));
} else {
reject(new Error(xhr.status));
}
};
});
};
promiseGet('https://jsonplaceholder.typicode.com/posts/1')
.then(res => console.log(res))
.catch(err => console.error(err))
.finally(() => console.log('Bye'));
const wrongUrl = 'https://jsonplaceholder.typicode.com/XXX/1';
promiseGet(wrongUrl)
.then(res => console.log(res),
err => console.error(err));
promiseGet(wrongUrl)
.then(res => console.log(res))
.catch(err => console.error(err)); // Error: 404
프로미스 체이닝(promise chaining)
프로미스는 프로미스 체이닝을 통해 비동기 처리 결과를 전달 받아 후속 처리하므로, 콜백 헬이 발생하지 않음
const resolvedPromise = Promise.resolve([1, 2, 3]);
// const resolvedPromise = Promise(resolve => resolve([1, 2, 3]));
resolvedPromise.then(console.log); // [1, 2, 3]
const rejectedPromise = Promise.reject(new Error('Error!'));
// const rejectedPromise = Promise(reject => reject(new Error('Error!')));
rejectedPromise.catch(console.log); // Error: Error!
Promise.all([
new Promise(resolve => setTimeout() => resolve(1), 3000)),
new Promise(resolve => setTimeout() => resolve(2), 2000)),
new Promise(resolve => setTimeout() => resolve(3), 1000))])
.then(console.log) // [1, 2, 3], 약 3초 소요
.catch(console.error);
Promise.all([
new Promise((_, reject) => setTimeout() => reject(new Error('Error 1')), 3000)),
new Promise((_, reject) => setTimeout() => reject(new Error('Error 2')), 2000)),
new Promise((_, reject) => setTimeout() => reject(new Error('Error 3')), 1000))
])
.then(console.log)
.catch(console.error); // Error: Error 3
Promise.all([
1, // Promise.resolve(1)
2, // Promise.resolve(2)
3, // Promise.resolve(3)
]).then(console.log) // [1, 2, 3]
.catch(console.error);
Promise.race([
new Promise(resolve => setTimeout() => resolve(1), 3000)),
new Promise(resolve => setTimeout() => resolve(2), 2000)),
new Promise(resolve => setTimeout() => resolve(3), 1000))])
.then(console.log) // 3
.catch(console.error);
Promise.race([
new Promise((_, reject) => setTimeout() => reject(new Error('Error 1')), 3000)),
new Promise((_, reject) => setTimeout() => reject(new Error('Error 2')), 2000)),
new Promise((_, reject) => setTimeout() => reject(new Error('Error 3')), 1000))
])
.then(console.log)
.catch(console.error); // Error: Error 3
Promise.allSettled([
new Promise(resolve => setTimeout(() => resolve(1), 2000)),
new Promise((_, reject) => setTimeout(() => reject(new Error('Error!')), 1000))
])
.then(console.log);
/*
[
{ status: "fulfilled", value : 1},
{status: "rejected", reason: Error: Error!}
]
*/
// fetch(url, [, option])
fetch('https://jsonplaceholder.typicode.com/todos/1')
.then(response => console.log(response));
fetch('https://jsonplaceholder.typicode.com/todos/1')
.then(response => response.json())
.then(json => console.log(json))
// {userId: 1, id: 1, title: "delectus aut autem", completed: false}
const wrongUrl = 'https://jsonplaceholder.typicode.com/XXX/1';
// 부적절한 URL이 지정되었기 때문에 404 Not Found 에러가 발생
fetch(wrongUrl)
// response는 HTTP 응답을 나타내는 Response 객체임
.then(response => {
if (!resonse.ok) throw new Error(response.statusText);
return response.json();
})
.then(todo => console.log(todo))
.catch(err => console.error(err));