ํ๋ก๋ฏธ์ค
๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ํ ์ฝ๋ฐฑ ํจํด์ ๋จ์
- ํจ์ ๋ด๋ถ์ ๋น๋๊ธฐ๋ก ๋์ํ๋ ์ฝ๋๋ฅผ ํฌํจํ๋ ํจ์๋ฅผ ๋น๋๊ธฐ ํจ์๋ผ๊ณ ํจ
- ๋น๋๊ธฐ ํจ์ ๋ด๋ถ์ ๋น๋๊ธฐ๋ก ๋์ํ๋ ์ฝ๋๊ฐ ์๋ ๊ฒฝ์ฐ? -> ๋น๋๊ธฐ ํจ์๊ฐ ์ข
๋ฃ๋ ์ดํ์ ์๋ฃ๋จ
- ์ฆ, ๋น๋๊ธฐ ํจ์ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ธ๋ถ๋ก ๋ฐํํ๊ฑฐ๋ ์์ ์ค์ฝํ ๋ณ์์ ํ ๋นํ๋ฉด ๊ธฐ๋ํ ๋๋ก ๋์๋์ง ์์
// GET ์์ฒญ์ ์ํ ๋น๋๊ธฐ ํจ์
const get = url => {
const xhr = new XMLHttpRequest();
xhr.open('GET', url);
xhr.send();
xhr.onload = () => {
if (xhr.status === 200) {
// โ ์๋ฒ์ ์๋ต์ ๋ฐํํ๋ค.
return JSON.parse(xhr.response);
}
console.error(`${xhr.status} ${xhr.statusText}`);
};
};
// โก id๊ฐ 1์ธ post๋ฅผ ์ทจ๋
const response = get('https://jsonplaceholder.typicode.com/posts/1');
console.log(response); // undefined
onload
์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ๋น๋๊ธฐ๋ก ๋์ ํ๊ธฐ ๋๋ฌธ
- ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ํ์คํฌ ํ์ ์ ์ฅ๋์ด ๋๊ธฐํ๋ค, ์ฝ ์คํ์ด ๋น๋ฉด ์ด๋ฒคํธ ๋ฃจํ์ ์ํด ์ฝ ์คํ์ผ๋ก ํธ์ ๋์ด ์คํ ๋๊ธฐ ๋๋ฌธ
- ์ ๋ฆฌ : ๋น๋๊ธฐ ํจ์๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ธ๋ถ์ ๋ฐํ ํ๊ฑฐ๋ ์์ ์ค์ฝํ์ ๋ณ์์ ํ ๋น ํ ์ ์๋ค.
- ๋ฐ๋ผ์, ๋น๋๊ธฐ ํจ์์ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ์ ๋ํ ํ์ ์ฒ๋ฆฌ๋ ๋น๋๊ธฐ ํจ์ ๋ด๋ถ์์ ์ํํด์ผ ํจ (์ฝ๋ฐฑ ํฌ ๋ฐ์)
- ์ฝ๋ฐฑ ํฌ์ ๊ฒฝ์ฐ ๊ฐ๋
์ฑ์ ๋ฌผ๋ก ์๋ฌ์ฒ๋ฆฌ๋ ๊ณค๋ํด์ง, ์ด๋ฅผ ๊ทน๋ณต ํ๊ธฐ ์ํด ES6 ๋ถํฐ ํ๋ก๋ฏธ์ค(
Promise
)๊ฐ ๋์
๋จ
ํ๋ก๋ฏธ์ค์ ์์ฑ
Promise
์์ฑ์ ํจ์๋ฅผ new
์ฐ์ฐ์์ ํจ๊ป ํธ์ถ ํ๋ฉด ํ๋ก๋ฏธ์ค ๊ฐ์ฒด๋ฅผ ์์ฑ
Promise
์์ฑ์ ํจ์๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ํํ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ธ์๋ก ๋ฐ๊ณ , ์ด ์ฝ๋ฐฑ ํจ์๋ resolve
์ reject
ํจ์๋ฅผ ์ธ์๋ก ์ ๋ฌ ๋ฐ๋๋ค.
const promise = new Promise((resolve, reject)=>{
// Promise ์ฝ๋ฐฑ ํจ์ ๋ด๋ถ์์ ๋น๋๊ธฐ ์ฒ๋ฆฌ ์ํ
if(/* ๋น๋๊ธฐ ์ฒ๋ฆฌ ์ฑ๊ณต */){
resolve('result');
} else {
reject('failure reason');
}
});
- ๋น๋๊ธฐ ์ฒ๋ฆฌ ์ฑ๊ณต ์
resolve
ํจ์ ํธ์ถ, ์คํจ์ reject
ํจ์ ํธ์ถ
// GET ์์ฒญ์ ์ํ ๋น๋๊ธฐ ํจ์
const promiseGet = url => {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.open('GET', url);
xhr.send();
xhr.onload = () => {
if (xhr.status === 200) {
// ์ฑ๊ณต์ ์ผ๋ก ์๋ต์ ์ ๋ฌ๋ฐ์ผ๋ฉด resolve ํจ์๋ฅผ ํธ์ถํ๋ค.
resolve(JSON.parse(xhr.response));
} else {
// ์๋ฌ ์ฒ๋ฆฌ๋ฅผ ์ํด reject ํจ์๋ฅผ ํธ์ถํ๋ค.
reject(new Error(xhr.status));
}
};
});
};
// promiseGet ํจ์๋ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํ๋ค.
promiseGet('https://jsonplaceholder.typicode.com/posts/1');
resolve
ํจ์์ ๋น๋๊ธฐ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ธ์๋ก ์ ๋ฌ
- ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ์คํจํ๋ฉด
reject
ํจ์์ ์๋ฌ๋ฅผ ์ ๋ฌ
- Promise๋ ํ์ฌ ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ์ด๋ป๊ฒ ์งํ ๋๊ณ ์๋์ง ๋ํ๋ด๋ ์ํ ์ ๋ณด๋ฅผ ๊ฐ์ง
ํ๋ก๋ฏธ์ค์ ์ํ ์ ๋ณด |
์๋ฏธ |
์ํ ๋ณ๊ฒฝ ์กฐ๊ฑด |
pending |
๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ์์ง ์ํ๋์ง ์์ ์ํ |
ํ๋ก๋ฏธ์ค๊ฐ ์์ฑ๋ ์งํ ๊ธฐ๋ณธ ์ํ |
fulfilled |
๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ์ํ๋ ์ํ(์ฑ๊ณต) |
resolve ํจ์ ํธ์ถ |
rejected |
๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ์ํ๋ ์ํ(์คํจ) |
reject ํจ์ ํธ์ถ |
- ์์ฑ๋ ์งํ์ ํ๋ก๋ฏธ์ค๋ ๊ธฐ๋ณธ์ ์ผ๋ก
pending
์ํ
- ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ์ํ๋๋ฉด ํ๋ก๋ฏธ์ค์ ์ํ๊ฐ ๋ณ๊ฒฝ ๋จ๋น๋๊ธฐ ์ฒ๋ฆฌ ์ฑ๊ณต : resolve ํจ์๋ฅผ ํธ์ถ ํด fulfilled ์ํ๋ก ๋ณ๊ฒฝ
๋น๋๊ธฐ ์ฒ๋ฆฌ ์คํจ : reject ํจ์๋ฅผ ํธ์ถ ํด rejected ์ํ๋ก ๋ณ๊ฒฝ
fulfilled ๋๋ rejected ์ํ๋ฅผ settled ์ํ๋ผ๊ณ ๋ถ๋ฆ
์ ๋ฆฌ : ํ๋ก๋ฏธ์ค๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ ์ํ์ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฐ์ฒด
ํ๋ก๋ฏธ์ค์ ํ์ ์ฒ๋ฆฌ ๋ฉ์๋
- ํ๋ก๋ฏธ์ค์ ๋น๋๊ธฐ ์ฒ๋ฆฌ ์ํ๊ฐ ๋ณํ ํ๋ฉด ์ด์ ๋ฐ๋ฅธ ํ์ ์ฒ๋ฆฌ ํ์
- ํ๋ก๋ฏธ์ค๋ ํ์ ๋ฉ์๋
then
, catch
, finally
์ ๊ณต
Promise.prototype.then
then
๋ฉ์๋๋ ๋ ๊ฐ์ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ธ์๋ก ์ ๋ฌ ๋ฐ๋๋ค.
- ์ฒซ ๋ฒ์งธ ์ฝ๋ฐฑ์
fulfilled
์ํ ๋๋ฉด(resolve
ํจ์ ํธ์ถ๋ ์ํ) ํธ์ถ, ์ด๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ธ์๋ก ์ ๋ฌ ๋ฐ์
- ๋ ๋ฒ์งธ ์ฝ๋ฐฑ์
rejected
์ํ๊ฐ ๋๋ฉด ํธ์ถ, ์ด๋ ์๋ฌ๋ฅผ ์ธ์๋ก ์ ๋ฌ ๋ฐ์
then
๋ฉ์๋๋ ์ธ์ ๋ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํ
- ๋ง์ฝ
then
๋ฉ์๋์ ์ฝ๋ฐฑ ํจ์๊ฐ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํ๋ฉด ๊ทธ ํ๋ก๋ฏธ์ค ๊ทธ๋๋ก ๋ฐํ, ์ฝ๋ฐฑ ํจ์๊ฐ ํ๋ก๋ฏธ์ค๊ฐ ์๋ ๊ฐ์ ๋ฐํ ํ๋ฉด ์๋ฌต์ ์ผ๋ก resolve ๋๋ reject ํ์ฌ ๋ฐํ
Promise.prototype.catch
catch
๋ฉ์๋๋ ํ ๊ฐ์ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ธ์๋ก ์ ๋ฌ ๋ฐ์
catch
์ ์ฝ๋ฐฑ ํจ์๋ rejected
์ผ ๋๋ง ํธ์ถ ๋จ
- ๋์ ๋ฐฉ์์
then
๊ณผ ๋์ผ
Promise.prototype.finally
- ํ๋ก๋ฏธ์ค์ ์ฑ๊ณต, ์คํจ์ ์๊ด ์์ด ๋ฌด์กฐ๊ฑด ํ ๋ฒ ํธ์ถ ๋๋ ํจ์
ํ๋ก๋ฏธ์ค์ ์๋ฌ ์ฒ๋ฆฌ
then
์ ๋ ๋ฒ์งธ ์ฝ๋ฐฑ ํจ์๋ก ์๋ฌ๋ฅผ ์ฒ๋ฆฌ ๊ฐ๋ฅ
catch
๋ฉ์๋ ํ์ฉ ํด์ ์๋ฌ ์ฒ๋ฆฌ ๊ฐ๋ฅ
catch
๋ฉ์๋๋ ๋ด๋ถ์ ์ผ๋ก then(undefined, onRejected) ํธ์ถthen์ ์ฒซ ๋ฒ์งธ ์ฝ๋ฐฑ์์ ๋ฐ์ํ ์๋ฌ๋ ๋๋ฒ์งธ ์ฝ๋ฐฑ์์ ์ฒ๋ฆฌ ๋ถ๊ฐ๋ฅ
๋ฐ๋ผ์ ์๋ฌ์ฒ๋ฆฌ๋ catch๋ก ํ๋ ๊ฒ์ ๊ถ์ฅ
promiseGet(url)
.then(res => consoloe.log(res))
.then(undefined, err => console.error(err));
// ์ ํจ์์ ๊ฐ์ ํจ์
promiseGet(url)
.then(res => consoloe.log(res))
.catch(err => console.error(err));
ํ๋ก๋ฏธ์ค ์ฒด์ด๋
- ํ๋ก๋ฏธ์ค ํ์ ์ฒ๋ฆฌ ๋ฉ์๋๋ ์ธ์ ๋ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํ๋ฏ๋ก ์ฐ์์ ์ผ๋ก ํธ์ถ ๊ฐ๋ฅ
- ์ด๋ฅผ ํ๋ก๋ฏธ์ค ์ฒด์ด๋ ์ด๋ผ ํ๋ค.
const url = 'https://jsonplaceholder.typicode.com';
// id๊ฐ 1์ธ post์ userId๋ฅผ ์ทจ๋
promiseGet(`${url}/posts/1`)
// ์ทจ๋ํ post์ userId๋ก user ์ ๋ณด๋ฅผ ์ทจ๋
.then(({ userId }) => promiseGet(`${url}/users/${userId}`))
.then(userInfo => console.log(userInfo))
.catch(err => console.error(err));
ํ๋ก๋ฏธ์ค์ ์ ์ ๋ฉ์๋
Promise.all
Promise.all
์ ์ฌ๋ฌ ๊ฐ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ๋ชจ๋ ๋ณ๋ ฌ ์ฒ๋ฆฌํ ๋ ์ฌ์ฉ๋๋ค.
- ๋น๋๊ธฐ ์ฒ๋ฆฌ ํจ์์ ์คํ ์์๊ฐ ์๊ด ์๋ ๊ฒฝ์ฐ
Promise.all
๋ฉ์๋๋ก ๋ณ๋ ฌ ์ฒ๋ฆฌ ํ๋ ๊ฒ์ด ํจ์จ์ ์ผ ์ ์๋ค.
Promise.all
๋ฉ์๋๋ ๋ฐฐ์ด ๋ฑ์ ์ดํฐ๋ฌ๋ธ์ ์ธ์๋ก ์ ๋ฌ ๋ฐ๋๋ค.
- ์ธ์๋ก ์ ๋ฌ๋ฐ์ ๋ฐฐ์ด์ ๋ชจ๋ ํ๋ก๋ฏธ์ค๊ฐ ๋ชจ๋ fulfilled ์ํ๊ฐ ๋๋ฉด ์ข
๋ฃํ๋ค.
Promise.all
๋ฉ์๋๋ ์ธ์๋ก ์ ๋ฌ ๋ฐ์ ์ดํฐ๋ฌ๋ธ์ ์์๊ฐ ํ๋ก๋ฏธ์ค๊ฐ ์๋ ๊ฒฝ์ฐ Promise.resolve
๋ก ๋ํ
const request1 = () => new Promise(resolve => setTimeout(() => resolve(1), 3000));
const request2 = () => new Promise(resolve => setTimeout(() => resolve(2), 2000));
const request3 = () => new Promise(resolve => setTimeout(() => resolve(3), 1000));
Promise.all([request1(), request2(), request3()])
.then(console.log) // [1,2,3]
.catch(console.err);
- ์ธ์๋ก ๋ฐ์ ์ดํฐ๋ฌ๋ธ์ด ๋ชจ๋
fulfilled
๋ ๋ ๊น์ง ๊ธฐ๋ค๋ ธ๋ค๊ฐ ์ฒซ ๋ฒ์งธ ํ๋ก๋ฏธ์ค ๋ถํฐ ์ฐจ๋ก๋๋ก ๋ฐฐ์ด์ ์ ์ฅํด ๊ทธ ๋ฐฐ์ด์ resolve
ํด์ ์๋ก์ด ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํ
- ์ฆ, ์ฒ๋ฆฌ ์์๊ฐ ๋ณด์ฅ ๋จ
Promise.race
Promise.all
๋ฉ์๋์ ๋์ผ ํ๊ฒ ๋์ ํ์ง๋ง ๊ฐ์ฅ ๋จผ์ fulfilled ๋๋ ํ๋ก๋ฏธ์ค์ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ
Promise.allSettled
Promise.allSettled
๋ฉ์๋๋ ํ๋ก๋ฏธ์ค๋ฅผ ์์๋ก ๊ฐ๋ ๋ฐฐ์ด ๋ฑ์ ์ดํฐ๋ฌ๋ธ์ ์ธ์๋ก ์ ๋ฌ๋ฐ์.
- ์ ๋ฌ๋ฐ์ ํ๋ก๋ฏธ์ค๊ฐ ๋ชจ๋
settled
์ํ(๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ์ํ๋ ์ํ)๊ฐ ๋๋ฉด ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐฐ์ด๋ก ๋ฐํ.
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! at <anonymous>:3:54}
]
*/
Promise.all
๊ณผ ๋ฌ๋ฆฌ fulfilled
, rejected
์ํ์ ์๊ด ์์ด ์ธ์๋ก ์ ๋ฌ ๋ฐ์ ๋ชจ๋ ํ๋ก๋ฏธ์ค๋ค์ ๊ฒฐ๊ด๊ฐ์ด ๋ชจ๋ ๋ด๊ฒจ ์์
Promise.allSettled
์ ๊ฒฐ๊ณผ ๊ฐ์ฒด
- ํ๋ก๋ฏธ์ค๊ฐ
fulfilled
์ธ ๊ฒฝ์ฐ: ๋น๋๊ธฐ ์ฒ๋ฆฌ ์ํ๋ฅผ ๋ํ๋ด๋ status
ํ๋กํผํฐ์ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ํ๋ด๋ value
ํ๋กํผํฐ๋ฅผ ๊ฐ์ง.
- ํ๋ก๋ฏธ์ค๊ฐ
rejected
์ธ ๊ฒฝ์ฐ: ๋น๋๊ธฐ ์ฒ๋ฆฌ ์ํ๋ฅผ ๋ํ๋ด๋ status
ํ๋กํผํฐ์ ์๋ฌ๋ฅผ ๋ํ๋ด๋ reason
ํ๋กํผํฐ๋ฅผ ๊ฐ์ง.
๋ง์ดํฌ๋ก ํ์คํฌ ํ
- ๋น๋๊ธฐ ํจ์์ ์ฝ๋ฐฑ ํจ์๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ ํ์คํฌ ํ์ ์ผ์ ์ ์ฅ๋ฉ๋๋ค.
- ํ๋ก๋ฏธ์ค์ ํ์ ์ฒ๋ฆฌ ๋ฉ์๋์ ์ฝ๋ฐฑ ํจ์๋ ํ์คํฌ ํ๊ฐ ์๋๋ผ ๋ง์ดํฌ๋ก ํ์คํฌ ํ์์ ์ ์ฅ
- ๋ง์ดํฌ๋ก ํ์คํฌ ํ๋ ํ์คํฌ ํ์ ๋์ผํ ์๋ฆฌ๋ก ๋์ ํ์ง๋ง, ํ์คํฌ ํ ๋ณด๋ค ์ฐ์ ์์๊ฐ ๋์ต๋๋ค.
fetch
fetch
ํจ์๋ XMLHttpRequest
๊ฐ์ฒด์ ๋ง์ฐฌ๊ฐ์ง๋ก HTTP ์์ฒญ ์ ์ก ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ Web API
์ด๋ค.
- ์ฌ์ฉ๋ฒ์ด ๊ฐ๋จํ๊ณ ํ๋ก๋ฏธ์ค๋ฅผ ์ง์ํ๊ธฐ ๋๋ฌธ์ ์ฝ๋ฐฑ ํจํด์ ๋จ์ ์ ๋ณด์ ๊ฐ๋ฅ
const promise = fetch(url [, options])
fetch
ํจ์๋ HTTP
์๋ต์ ๋ํ๋ด๋ Response
๊ฐ์ฒด๋ฅผ ๋ํํ Promise
๊ฐ์ฒด๋ฅผ ๋ฐํ
- ์ฆ, ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ์ ํ์ ์ฒ๋ฆฌ๋ฉ์๋ (then, catch) ์ฌ์ฉ ๊ฐ๋ฅ
then
์ ํตํด resolveํ Response ๊ฐ์ฒด๋ HTTP ์๋ต์ ๋ํ๋ด๋ ๋ค์ํ ํ๋กํผํฐ๋ฅผ ์ ๊ณต์๋ฅผ ๋ค์ด Response.prototype.json ๋ฉ์๋๋ HTTP ์๋ต ๋ชธ์ฒด๋ฅผ ์ทจ๋ํ ํ์ฌ ์ญ์ง๋ ฌํ ํ๋ค.
๋๊ธ