๐ ๋ณธ ๊ธ์ 2022๋ 5์ 13์ผ ๊ฐ์ธ github ์ ์์ฑ๋ ๊ธ์ ๋๋ค.
๐ axios await / async vs then
ํ๋ก์ ํธ ๋ฐฐํฌ ๋น์ผ ๋ฐค์ ๊ผฌ๋ฐ ์์ฐ๊ณ ์์นจ์ ๊ธํ๊ฒ ๊ธฐ๋ฅ์ ์ถ๊ฐํด์ผํ๋ ์ผ์ด ์๊ฒผ๋ค.
ํ๋ก ํธ์์๋ ๋ด๊ฐ ๋งก์์ ํ๊ฒ ๋์๋๋ฐ, ๊ฐ๋จํ ๊ธฐ๋ฅ์ด์ฌ์ ๋นจ๋ฆฌ ๋๋ผ ์ ์๋ค๋ ๋ด ์์๊ณผ ๋ฌ๋ฆฌ,๋ฐฑ ์ฐ๊ฒฐ์์ ๋ฌธ์ ๊ฐ ์๊ฒผ๋ค. axios ๋ฅผ ์ด์ฉํด์ get ์์ฒญ์ ํ๋๋ฐ, data๋ฅผ ๊ฐ์ ธ์ค์ง ๋ชปํ๋ค..๐ต๐ซ ์ฒ์์๋ axios ๋ฌธ์ ์ธ์ง ๋ชจ๋ฅด๊ณ ๋ค๋ฅธ ๋ถ๋ถ์ ๋ฌธ์ ์ธ๊ฑด๊ฐ ํ๋ ์๊ฐ์ด ๋ค์ด ์ด๋ฆฌ์ ๋ฆฌ ๊ณ ์ณ๋ณด๋ค, ์ ์ด๋ด๊น...ํ์ฐธ ๊ณ ๋ฏผํ๋ค ๊ทธ๋ฅ then ์ ์ด์ฉํ๋ data ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์๋ค...๊ฑฐ์ 1์๊ฐ ๋์์ ์ฝ์ง์ด์๋ค...
๋ฌธ์ ์ ์ฝ๋..๐ฅฒ
const [commentList, setCommentList] = useState([]);
useEffect(() => {
try {
const res = Api.get('comment');
console.log(res.data); // undefined
}, []);
ํด๊ฒฐ ๋ฐฉ๋ฒ
const [commentList, setCommentList] = useState([]);
useEffect(() => {
try {
Api.get('comment').then((res) => {
setCommentList(res.data);
});
} catch (error) {
console.log(error);
}
}, []);
โ ๏ธ const ์ then ์ ์ฐจ์ด...?
์ฒ์์๋ ๋ณ์๋ก ๋ฐ๋ ๊ฒ๊ณผ then ์ผ๋ก ๊ฐ์ ธ์ค๋ ๊ฒ์ ๋ํ ์ฐจ์ด์ธ ์ค ์์๋ค. ๋๋ ๋ชจ๋ฅด๋ ์ฐจ์ด์ ์ด ์๊ตฌ๋ ํ๊ณ ...ํ๋ก์ ํธ ๊ธฐ๊ฐ์ด ๋๋๊ณ ์ด ๋ฌธ์ ์ ์์ธ์ ์๊ธฐ ์ํด ์๋ฌด๋ฆฌ ๊ตฌ๊ธ์ ๊ฒ์์ ํด๋ ์ด ๋์ ์ฐจ์ด์ ์ ๋์ค์ง ์์๋ค. ๊ทผ๋ฐ ๋ด๊ฐ ์๊ฐํด๋...์ฐจ์ด๊ฐ ์๋ ํ๋ ์๊ฐ์ด ๋ค์๋ค. ๋ค์ ๋ฌธ์ ์ ์ฝ๋๋ฅผ ๋ณด๋..await async ๋ฅผ ์ฌ์ฉํ์ง ์์๋ค๋ ๊ฒ์ ์๊ฒ ๋์๋ค..๐ฅฒ
async await ๋ฅผ ์ฌ์ฉํด์ ๋ค์ ์ฝ๋๋ฅผ ์์ฑํด๋ณด๋ ๋ฌธ์ ์์ด data ๋ฅผ ๊ฐ์ ธ์๋ค..!!
const [commentList, setCommentList] = useState([]);
useEffect(() => {
sample();
}, []);
const sample = async () => {
const res = await Api.get('comment');
setCommentList(res.data);
};
๊ทธ๋ผ then์ ์ฌ์ฉํ๋ฉด async await ๋ฅผ ์ฌ์ฉํ์ง ์์๋ ๋๋ค๋ ๊ฒ์ธ๊ฐ? ํ๋ ์๊ฐ์ด ๋ค์๋ค. ๐คฆโ๏ธ
๊ธ์ ์ ๋ฆฌํ๋ฉด์ ์ ๋ ์ด ์๊ฐ์๋ ์ด๋ฐ ๊ฒ์ ์ ๋๋ก ๋ชฐ๋๋ค๋ ๊ฒ์ ๋ํด ๋๋ฌด..์ด์ด๊ฐ ์๋ค.
์ฌ์ง์ด ๋ถ๋๋ฝ๊ฒ๋ ๋๋ฆผ์ฝ๋ฉ ์ ํ๋ธ๋ฅผ ํตํด ๋ฃ๊ณ ์ ๋ฆฌ๊น์ง ํ ๋ถ๋ถ๋ค์ธ๋ฐ,,,,์๋ฌด ์๊ฐ์์ด ํ๊ตฌ๋. ํ๋ ์๊ฐ์ด ๋ค์๋ค.
๊ทธ๋์ ์ด๋ฒ ๊ธ์ ์ฃผ์ ๋ axios then , await/async ์ด๋ค!
โ ๏ธ ์ผ๋จ ๋น๋๊ธฐ ๋ค์ ํ๋ฒ ๋ ์์๋ณด์!
๋น๋๊ธฐ๋ ์ ์๋ค๊ณ ์๊ฐํ๋๋ฐ,,,์ญ์ ๋์ ์ฐฉ๊ฐ์ด๋ค. ์ ์ผ ์ค์ํ ๊ฒ์ ์์ด๋ฒ๋ฆฌ๋ค๋.....๐ก
๋น๋๊ธฐ๋ ๋ฌด์์ผ๊น? ๋ถํฐ ๋ค์ ๊ฐ๋จํ๊ฒ! ํ๋ฒ ์ ๋ฆฌํด๋ณด์.
๋๊ธฐ๋ ์์ฐจ์ ์ผ๋ก ์ฝ๋๊ฐ ์คํ๋๋ ๊ฒ์ด๋ค.
๊ทธ๋ผ ๋น๋๊ธฐ๋? ์์ฐจ์ ์ผ๋ก ์คํ๋์ง ์๋ ๊ฒ! ์ด์ ์์
์ํ ์ค์๋ ๋ค๋ฅธ ์์
์ ์ํํ ์ ์๊ฒ ํ๋ ๊ฒ์ด๋ค!
โญ๏ธ Promise ๋?
const [commentList, setCommentList] = useState([]);
useEffect(() => {
try {
const res = Api.get('comment');
console.log(res); // Promise ๊ฐ์ฒด
console.log(res.data); // undefined
}, []);
์์ ์ฝ๋์์ console.log(res) ๋ Promise ๊ฐ์ฒด๊ฐ ์ถ๋ ฅ๋๊ณ , console.log(res.data) ๋ undefined ์ด ์ถ๋ ฅ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
๋๋ ์ถ๋ ฅ๋ Promise ๊ฐ์ฒด๋ฅผ ๋ณด๊ณ , ์ด! ์ด๋์ ๋ดค๋๋ฐ? ํ๊ณ ์ง๋์ณค๋ค... ๊ทธ์ ์ res.data ๊ฐ undefined ์ผ๋ก ์ถ๋ ฅ๋๋ ์ด์ ์๋ง ์ง์ค์ ํ๊ณ ์ ์๋์ง? ๋ง ๋ฐ๋ณตํ์๋ค.๐คฆโ๏ธ
์ ์๋๊ฑธ๊น? then ์ ์จ์ผ์ง!!!!!!!!
์ผ๋จ Promise ๊ฐ ๋ฌด์์ธ์ง๋ถํฐ ๋ค์ ์ ๋ฆฌํด๋ณด์! (callback ์ ์ฌ๊ธฐ์๋ ์ ๋ฆฌํ์ง ์๊ฒ ๋ค. )
โ
Promise?
์ฝ๊ฒ ๋งํด, ๋น๋๊ธฐ๋ฅผ ๊ตฌํํ ๋ ์ฌ์ฉ๋๋ ๊ฐ์ฒด์ด๋ค.
์์ ์ velog ์ ๋๋ฆผ์ฝ๋ฉ ์ ํ๋ธ ๊ฐ์ ์ค ๋น๋๊ธฐํธ์์ ์ ๋ฆฌํด๋์ ๊ธ์ด๋ค. Promise ๋ ๋น๋๊ธฐ๋ฅผ ๊ตฌํํ ๋ ์ฌ์ฉ๋๋ ๊ฐ์ฒด์ด๋ค!
์กฐ๊ธ ๋ ์ถ๊ฐํ์๋ฉด,
์คํ์ ๋ฐ๋ก ํ์ง๋ง, ๋ฐ์ดํฐ๋ฅผ ๋ค ๋ฐ์์ค๊ธฐ ์ ์ ๋ฐ์ดํฐ๋ฅผ ํ๋ฉด์ ํ์ํ๋ ค๊ณ ํ๋ฉด, ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ฑฐ๋ ๋น ํ๋ฉด์ด ์ถ๋ ฅ๋๋ค. ์ด๋ฌํ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๋ ๊ฒ์ด ํ๋ก๋ฏธ์ค๋ค!
โ Promise ์ฌ์ฉํ๊ธฐ ์ํด์๋ then ์ ์ด์ฉํ๋ค!
ํ๋ก๋ฏธ์ค ์ํ์ ๋ณด์๋
panding(๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ์์ง ์ํ๋์ง ์์ ์ํ = ํ๋ก๋ฏธ์ค๊ฐ ์์ฑ๋ ์งํ ๊ธฐ๋ณธ ์ํ),
fulfilled(๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ์ํ๋ ์ํ(์ฑ๊ณต)= resolve ํจ์ ํธ์ถ),
rejected(๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ์ํ๋ ์ํ(์คํจ)= reject ํจ์ ํธ์ถ),
seletted(๋น๋๊ธฐ ์ฒ๋ฆฌ ์ฑ๊ณต,์คํจ์ ์๊ด์์ด ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ์ํ๋ ์ํ) ๊ฐ ์๋ค.
๊ทธ๋ฆฌ๊ณ ๋ง๋ค์ด์ง ํ๋ก๋ฏธ์ค ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด then, catch, finally ๊ฐ ์๋ค.
then : ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ์ฑ๊ณตํ์ ๋ ํธ์ถ๋๋ ์ฝ๋ฐฑํจ์์ ์คํจํ์ ๋ ํธ์ถ๋๋ ์ฝ๋ฐฑํจ์ ์ด ๋ ๊ฐ์ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ธ์๋ก ์ ๋ฌ๋ฐ๋๋ค.
finally : ํ๋ก๋ฏธ์ค์ ์ฑ๊ณต, ์คํจ์ ์๊ด์์ด ๋ฌด์กฐ๊ฑด ํ๋ฒ ํธ์ถ๋๋ค.
catch: ํ๋ก๋ฏธ์ค ์ํ๊ฐ rejected ์ธ ๊ฒฝ์ฐ์๋ง ํธ์ถ.
์๋์ ์์๋๋ฅผ ํตํด ๋ ์์ธํ ์ดํดํ ์ ์๋ค!
๊ทธ๋ผ ๋์ ๋ฌธ์ ์ ์ฝ๋๋ฅผ ์๋ฒฝํ๊ฒ Promise ๋ฅผ ์ด์ฉํ ์ฝ๋๋ก ์์ ํ๋ฉด,
์ผ๋จ ์๋ฌ์ฒ๋ฆฌ๋ฅผ try catch ๊ตฌ๋ฌธ์ด ์๋ catch ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผํ๋ค!
const [commentList, setCommentList] = useState([]);
useEffect(() => {
Api.get('comment')
.then((res) => {
setCommentList(res.data);
})
.catch((err) => {
console.log('then error: ', err);
});
}, []);
โญ๏ธ ๊ทธ๋ผ async/ await ?
๊ฐ์ฅ ์ต๊ทผ์ ๋์จ ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ฌธ๋ฒ์ผ๋ก Promise ์ ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํด! ๋์๋ค.
Promise ์ ๋จ์ ์ด ๋ฌด์์ผ๊น? ๋ฐ๋ก then ์ง์ฅ, ๊ผฌ๋ฆฌ์ ๊ผฌ๋ฆฌ๋ฅผ ๋ฌด๋ ์ฝ๋๊ฐ ๋ ์ ์๋ค๋ ๊ฒ์ด๋ค.
async/ await ๋ ์ด๋ฐ promise ์ ๋จ์ ์ ๋ณด์ํ์ฌ, ๊ฐ๋ ์ฑ์ด ์ข๋ค!
โ ๊ธฐ๋ณธ ๋ฌธ๋ฒ
async function ํจ์๋ช
() {
await ๋น๋๊ธฐ_์ฒ๋ฆฌ_๋ฉ์๋_๋ช
();
}
โ๏ธ async : function ์์ async ๋ฅผ ๋ถ์ด๋ฉด, ํด๋น ํจ์๋ ํญ์ Promise ๋ฅผ ๋ฐํํ๊ฒ ๋๋ค!
๋ง์ฝ Promise ๊ฐ ์๋ ๊ฐ์ด ๋ฐํ ๋๋๋ผ๋ ์ดํ ์ํ์ Promise ๋ก ๊ฐ์ ๊ฐ์ธ Promise ๊ฐ ๋ฐํ๋๋ค๊ณ ํ๋ค!
โ๏ธ await : async ํจ์ ์์์๋ง ์๋! ์๋ฐ์คํฌ๋ฆฝํธ๋ await ํค์๋๋ฅผ ๋ง๋๋ฉด, Promise ๊ฐ ์ฒ๋ฆฌ๋ ๋ ๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค!
โ ๏ธ ๋จ try ~ catch ๊ตฌ๋ฌธ์ ์ด์ฉํ์ฌ ์๋ฌ ์ฒ๋ฆฌ๋ฅผ ํด์ค์ผ ํ๋ค!
โ ๏ธ ์ต์์ ๋ ๋ฒจ ์ฝ๋์์๋ ์๋ํ์ง ์๋๋ฐ, ์ต๋ช async ํจ์๋ก ์ฝ๋๋ฅผ ๊ฐ์ฌ๋ฉด ์ต์์ ๋ ๋ฒจ ์ฝ๋์๋ await ๋ฅผ ์ฌ์ฉํ ์ ์๋ค!
(async () => {
let response = await fetch('/article/promise-chaining/user.json');
let user = await response.json();
...
})();
๋ง๋ฌด๋ฆฌ
๋๋ฌด ์ด์ฒ๊ตฌ๋ ์๊ณ , ๋ถ๋๋ฌ์ด ์ค์์๋ค.
์ง๊ธ์ด๋ผ๋ ์๊ฒ๋์ด ๋งค์ฐ ๋คํ์ด๋ค...๐ฅฒ
์ ๋๋ก ๊ณต๋ถํ์!
๐ Reference
https://ko.javascript.info/async-await
๋๋ฆผ์ฝ๋ฉ ์ ๋ฆฌ ๊ธ : https://velog.io/@naakite/6-Callback-Promise
'๐ WIL > ๐ JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Polyfill์ด๋? (1) | 2024.12.08 |
---|---|
CustomEvent (3) | 2024.11.10 |
๐ก ํ์๋๋ก e.target.value๋ฅผ ์ด์ฉํ๋๋ฐ, ์์๊ฐ์ ๊ฐ์ ธ์ค์ง ๋ชปํ๋ค..? - ํ ํ๋ก์ ํธ (0) | 2022.08.11 |
โ๏ธ ๋น๊ตฌ์กฐํ ํ ๋น (0) | 2022.08.10 |
๐ก ์์ ๋ณต์ฌ, ๊น์ ๋ณต์ฌ (0) | 2022.08.10 |