[React/JS] Promise ํ๋ก๋ฏธ์ค๋ฅผ ํ์ฉํ UX ๊ฐ์ — ํด ๋ฏธ๋ฃจ๊ธฐ
๋๊ธฐ ์์ ์ ๊ธฐ๋ค๋ฆฌ๋ ํ๋ก๋ฏธ์ค
ํ๋ก๋ฏธ์ค๋ ๋ชจ๋ ๋๊ธฐ ์์ ์ ์๋ฃํ ํ์ ์คํํ ์ ์๋ค.
์๋ ์์์์ then
ํ์ ์ฒ๋ฆฌ ๋ฉ์๋์ ๋๊ธด console.log
๋ ์ ๋ ์คํ๋์ง ์๋๋ค.
// ์ฝ๋ ์ฐธ๊ณ via ์ค๋์ ํ๋ก๊ทธ๋๋ฐ
new Promise((resolve) => {
console.log('1'); // ๋๊ธฐ ์์ญ
resolve('2');
}).then(console.log); // ๋น๋๊ธฐ ์์ญ
let i = 0;
while (true) {
i += 1;
}
ํ๋ก๋ฏธ์ค ์์ฑ์์ ๋๊ธด ์ฝ๋ฐฑ ํจ์๋ ๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ฏ๋ก ์ฝ์์ 1
์ ์ถ๋ ฅํ๋ค. resolve
ํจ์๊ฐ ์คํ๋๋ฉด ํ๋ก๋ฏธ์ค๋ ์ดํ(fulfilled) ์ํ๊ฐ ๋๊ณ ๊ฒฐ๊ณผ ๊ฐ๊ณผ ํจ๊ป ์๋ก์ด ํ๋ก๋ฏธ์ค๋ฅผ ๋ฆฌํดํ๋ค. ๊ทธ๋ผ then
ํ์ ์ฒ๋ฆฌ ๋ฉ์๋๋ก ์คํ ํด์ด ๋์ด๊ฐ๋ค. ์ฌ๊ธฐ์๋ถํฐ ๋น๋๊ธฐ ์์ญ์ด๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ์คํ๋์ง ์๋๋ค.
ํ๋ก๋ฏธ์ค ๋ค์ ์ฝ๋์ i
๋ฅผ 1
์ฉ ์ฆ๊ฐ์ํค๋ ๋ฌดํ ๋ฃจํ๊ฐ ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ค. ์ด ๋ฌดํ ๋ฃจํ ๋๋ฌธ์ then
ํ์ ์ฒ๋ฆฌ ๋ฉ์๋๊ฐ ์คํ๋์ง ์๋ ๊ฒ์ด๋ค. ์ด์ฒ๋ผ ํ๋ก๋ฏธ์ค๋ ๋ชจ๋ ๋๊ธฐ ์์
์ ์๋ฃํด์ผ๋ง ์คํ๋๋ค.
ํ๋ก๋ฏธ์ค๋ฅผ ์ด์ฉํด ๋ค์ ํด์ผ๋ก ์์ ๋ฏธ๋ฃจ๊ธฐ
๊ฐ์ ํด์ ์ํํ ์์ ์ด ๋ง๋ค๋ฉด Async/Await๋ฅผ ์ฌ์ฉํ๊ธฐ ๋ณด๋จ ํ๋ก๋ฏธ์ค๋ฅผ ์ด์ฉํด ๋ค์ ํด์ผ๋ก ๋ฏธ๋ฃฐ ์๋ ์๋ค.
// ์ฝ๋ ์ฐธ๊ณ via ์ค๋์ ํ๋ก๊ทธ๋๋ฐ
login() // TURN 1
.then(() => {
changeUI(); // TURN 2
return updateProfile();
})
.then(() => {
reloadPage(); // TURN 3
});
์ ์ฝ๋๋ ์๋ ๊ณผ์ ์ผ๋ก ์คํ๋๋ค. ๊ฐ ํด(Turn)์ ๋ชจ๋ ๋๊ธฐ ์์ ์ด ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค. ์ฆ, ๋๊ธฐ ์์ ์ ๋ง์น ํ ํ๋ก๋ฏธ์ค๋ฅผ ์คํํ ์ ์๋ ํ์ด๋ฐ์ด ์์ ๋ ๋น๋ก์ ์คํ๋๋ค.
- [TURN 1]
login()
์คํ
——— ๋๊ธฐ ์์ ์คํ ——— - [TURN 2]
changeUI()
,updateProfile()
์คํ
——— ๋๊ธฐ ์์ ์คํ ——— - [TURN 3]
reloadPage()
์คํ
ํ๋ก๋ฏธ์ค๋ฅผ ํ์ฉํ UX ๊ฐ์
์ ์ ์ ๋ณด, ๊ฒฐ์ ๋ด์ญ, ์น๊ตฌ ๋ชฉ๋ก์ ๋ณด์ฌ์ฃผ๋ ๋ง์ดํ์ด์ง๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ณธ๋ค. 3๊ฐ ๋ชจ๋ ์ค์ํ ์ ๋ณด์ง๋ง ๋ง์ดํ์ด์ง๋ ์ ์ ์ ๋ณด๋ฅผ ์ฐ์ ์ ์ผ๋ก ๋ณด์ฌ์ฃผ๋ ๊ณต๊ฐ์ด๋ค. ํ์ง๋ง ์๋ ์์์์ ๋ชจ๋ ๋ฐ์ดํฐ Fetching์ ์๋ฃํด์ผ๋ง ๋ถ๋ฌ์จ ์ ๋ณด๋ฅผ ์ฌ์ฉ์์๊ฒ ํ์ํ ์ ์๋ค. ์ฒซ ๋ ๋๋ง์ ๋ก๋ฉ ์๊ฐ์ด ๋ ๊ธธ์ด์ง๋ ์ ์ด๋ค.
// ์ฝ๋ ์ฐธ๊ณ via ์ค๋์ ํ๋ก๊ทธ๋๋ฐ
function MyPage() {
const [userInfo, setUserInfo] = useState(null);
const [billHistory, setBillHistory] = useState([]);
const [friendsList, setFriendsList] = useState([]);
useEffect(() => {
(async () => {
const userInfoData = await fetchUserInfo();
const billHistoryData = await fetchBillHistory();
const friendsListData = await fetchFriendsList();
setUserInfo(userInfoData);
setBillHistory(billHistoryData);
setFriendsList(friendsListData);
})();
}, []);
// ...
}
then
๋ฉ์๋๋ฅผ ํ์ฉํด ์ ์ ์ ๋ณด๋ฅผ ๋ถ๋ฌ์ค๋ fetchUserInfo
๋ฅผ ๋จผ์ ์คํํ๋๋ก ์์ ํ๋ฉด, ๊ฒฐ์ ๋ด์ญ๊ณผ ์น๊ตฌ ๋ชฉ๋ก์ ๋ํ ๋ฐ์ดํฐ Fetching์ ์ฒซ ๋ ๋๋ง์์ ์ ์ธ์ํฌ ์ ์๋ค. ๊ทธ๋ผ ์ฌ์ฉ์๋ ์ ์ ์ ๋ณด๋ฅผ ์กฐ๊ธ ๋ ๋นจ๋ฆฌ ๋ณผ ์ ์๊ฒ ๋๋ค. then
๋ฉ์๋์ ์ฝ๋ฐฑ์ API ํธ์ถ ์ดํ ๋ชจ๋ ๋๊ธฐ ์์
์ ์๋ฃํ ์์ ์ ์คํ๋๋ค.
// ์ฝ๋ ์ฐธ๊ณ via ์ค๋์ ํ๋ก๊ทธ๋๋ฐ
function MyPage() {
const [userInfo, setUserInfo] = useState(null);
const [billHistory, setBillHistory] = useState([]);
const [friendsList, setFriendsList] = useState([]);
useEffect(() => {
fetchUserInfo().then(async (userInfoData) => {
// ๋ฐ์ดํฐ Fetching ์ดํ ๋ชจ๋ ๋๊ธฐ ์์
์ ์๋ฃํ๋ฉด ์คํ ↓
setUserInfo(userInfoData);
const billHistoryData = await fetchBillHistory();
const friendsListData = await fetchFriendsList();
setBillHistory(billHistoryData);
setFriendsList(friendsListData);
});
}, []);
// ...
}
๐ก setUserInfo
๋์คํจ์น ํธ์ถ์ await fetchUserInfo
๋ฐ๋ก ๋ค์ ๋ผ์ธ์ผ๋ก ์ด๋์ํค๋ ๋ฐฉ๋ฒ๋ ์๋ค. ๊ฒฐ๊ณผ๋ ๋์ผํ์ง๋ง ๋๊ธฐ ์์
์ปจํธ๋กค์ then
์ ์ฌ์ฉํ์ ๋๊ฐ ๋ ์ฉ์ดํ๋ค.
๋ ํผ๋ฐ์ค
๊ธ ์์ ์ฌํญ์ ๋ ธ์ ํ์ด์ง์ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ๋ฐ์๋ฉ๋๋ค. ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์
'๐ช Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] ๋ฆฌ์กํธ์์ Rendering ๋ ๋๋ง์ด๋? (0) | 2024.05.16 |
---|---|
[TS] TypeScript ํ์ ์คํฌ๋ฆฝํธ satisfies ์ฐ์ฐ์ (0) | 2024.05.16 |
[React] ๋ฆฌ์กํธ Profiler ํ๋กํ์ผ๋ฌ์ Hook ์์ (0) | 2024.05.16 |
[DevTools] iPhone ์์ดํฐ ์ฌํ๋ฆฌ์์ ๋๋ฒ๊น / ์ฝ์ ์ฌ์ฉํ๊ธฐ (0) | 2024.05.16 |
[JS/React] input ํ๋์ ์ซ์๋ง ์ ๋ ฅ ํ์ฉํ๊ธฐ (ํ๊ธ ์ ๋ ฅ ๋ฐฉ์ง) (0) | 2024.05.16 |
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[React] ๋ฆฌ์กํธ์์ Rendering ๋ ๋๋ง์ด๋?
[React] ๋ฆฌ์กํธ์์ Rendering ๋ ๋๋ง์ด๋?
2024.05.16 -
[TS] TypeScript ํ์ ์คํฌ๋ฆฝํธ satisfies ์ฐ์ฐ์
[TS] TypeScript ํ์ ์คํฌ๋ฆฝํธ satisfies ์ฐ์ฐ์
2024.05.16 -
[React] ๋ฆฌ์กํธ Profiler ํ๋กํ์ผ๋ฌ์ Hook ์์
[React] ๋ฆฌ์กํธ Profiler ํ๋กํ์ผ๋ฌ์ Hook ์์
2024.05.16 -
[DevTools] iPhone ์์ดํฐ ์ฌํ๋ฆฌ์์ ๋๋ฒ๊น / ์ฝ์ ์ฌ์ฉํ๊ธฐ
[DevTools] iPhone ์์ดํฐ ์ฌํ๋ฆฌ์์ ๋๋ฒ๊น / ์ฝ์ ์ฌ์ฉํ๊ธฐ
2024.05.16