์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- ๋ฅ๋ฌ๋
- DFS
- ๋ฐฑ์ค
- AWS
- react
- Git
- ๋ฆฌ์กํธ
- ํ ์คํธ๋ถ์
- ์๋ฐ์คํฌ๋ฆฝํธ
- ๊นํ๋ธ
- ๋น ๋ฐ์ดํฐ
- ํ๋ธ๋ฃจ
- ์ฝํ
- erp
- ํ ์คํธ๋ง์ด๋
- ๋ฐ์ดํฐ๋ถ์
- ์ฝ๋ฉํ ์คํธ
- abap
- ๋ฐ์ดํฐ ๋ถ์
- ํ๋ธ๋ก
- ์์ฐ์ด์ฒ๋ฆฌ
- AI
- ํ์ด์ฌ
- tableau
- ์๊ณ ๋ฆฌ์ฆ
- github
- nlp
- ์ธ๊ณต์ง๋ฅ
- sap
- ์๋ง์กด์น์๋น์ค
- Today
- Total
DATA101
[React] Promise ์ญํ ๋ฐ ์ํ(pending, resolve, reject) ๋ณธ๋ฌธ
[React] Promise ์ญํ ๋ฐ ์ํ(pending, resolve, reject)
DATA101 2021. 12. 14. 22:15๐ฅ ๋ชฉํ
์๋ฐ์คํฌ๋ฆฝํธ(๋ฆฌ์กํธ)์์ Promise์ ์ญํ ๊ณผ ์ํ 3๊ฐ์ง์ ๋ํด ์ดํดํ๋ค.
๐ ๋ชฉ์ฐจ
1. Promise๋ ๋ฌด์์ธ๊ฐ?
2. Promise์ ์ญํ
3. Promise์ ์ํ(State)
3.1. Pending(๋๊ธฐ)
3.2. Fulfilled(์ดํ)
3.2.1. ์๊ฐ
3.2.2 Promise ๊ฐ์ฒด ์ฐ๊ฒฐ
3.3. Rejected(์คํจ)
3.3.1. ์๊ฐ
3.3.2. ํ์ฉ ์์
1. Promise๋ ๋ฌด์์ธ๊ฐ?
JavaScript(React)์์ Promise๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ํ์ฉ๋๋ ๊ฐ์ฒด์ ๋๋ค. ์ฌ๊ธฐ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ line by line ์์ฐจ์ ์ผ๋ก ํน์ ์ฝ๋์ ์คํ์ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ค์ ์ฝ๋๋ฅผ ์ ์ ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
2. Promise์ ์ญํ
Promise๋ ์ฃผ๋ก ์น ์๋น์ค ๊ตฌํ ์ ์ํํ ๋ฐ์ดํฐ ํต์ ์ ์ํด ํ์ฉ๋ฉ๋๋ค. ๋์ฑ ๊ตฌ์ฒด์ ์ผ๋ก ๋ง์๋๋ฆฌ์๋ฉด, ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ์ ๋, ๋ฐ์ดํฐ๊ฐ ๋ชจ๋ ๋ฐ์์ค๊ธฐ ์ ์ ์น์ ์ถ๋ ฅํ๋ ค๊ณ ํ ๋ ๋ฐ์ํ๋ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ํ์ฉ๋ฉ๋๋ค. ์ฆ, Promise ๊ฐ์ฒด๋ A, B, C ๋ก์ง์ด ์์ ๋, A ๋ก์ง์ด ๋ชจ๋ ์๋ฃ๋ ๋๊น์ง B, C ๋ก์ง์ ๋๊ธฐ์ํค์ง ์๊ณ ์คํ์ํค๋ ๋ฐ ์ฃผ๋ก ํ์ฉ๋ฉ๋๋ค.
3. Promise์ ์ํ(State)
Promise ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ณ ์ข ๋ฃ๋ ๋๊น์ง๋ ์๋์ ๊ฐ์ด 3๊ฐ์ง ์ํ(state)๋ฅผ ๊ฐ์ต๋๋ค. ์ฌ๊ธฐ์ ์ํ๋ Promise์ ์ฒ๋ฆฌ ๊ณผ์ (process)์ ์๋ฏธํฉ๋๋ค. ๊ฐ๊ฐ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
์ํ(State) | ์ค๋ช |
Pending(๋๊ธฐ) | ๋น๋๊ธฐ ๋ก์ง ์ฒ๋ฆฌ์ ๋ฏธ์๋ฃ ์ํ |
Fulfilled(์ดํ) | ๋น๋๊ธฐ ๋ก์ง ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋ ์ํ๋ก Promise ๊ฒฐ๊ด๊ฐ ๋ฐํ ์ํ |
Rejected(์คํจ) | ๋น๋๊ธฐ ๋ก์ง ์ฒ๋ฆฌ์ ์คํจ ๋๋ ์ค๋ฅ ์ํ |
3.1. Pending(๋๊ธฐ)
์๋์ ๊ฐ์ด Promise ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ฉด ๋๊ธฐ(Pending) ์ํ์ ๋๋ค.
new Promise();
์๋์ ๊ฐ์ด new Promise() ๋ฉ์๋ ํธ์ถ ์ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ ์ธํ ์ ์์ผ๋ฉฐ, ์ธ์๋ resolve์ reject์ ๋๋ค.
new Promise((resolve, reject) => {});
3.2. Fulfilled(์ดํ)
3.2.1. ์๊ฐ
์๋์ ๊ฐ์ด ์ฝ๋ฐฑ ํจ์ ์ธ์์ธ resolve๋ฅผ ์คํํ๋ฉด ์ดํ๋(Fulfilled) ์ํ์ ๋๋ค. ์ฐธ๊ณ ๋ก, ์ดํ๋ ์ํ๋ฅผ ๋ค๋ฅธ ๋ง๋ก ์๋ฃ๋ ์ํ๋ผ๊ณ ๋ ํฉ๋๋ค.
new Promise(function(resolve, reject) {
resolve();
});
์ดํ ์ํ๊ฐ ๋๋ฉด then()์ ํ์ฉํ์ฌ ๊ฒฐ๊ด๊ฐ์ ๋ฐ์ ์ ์์ต๋๋ค.
function getData(){
return new Promise( (resolve, reject) => {
let data = 10;
resolve(data);
})
}
getData().then((resolvedData) => console.log(resolvedData));
์คํ๊ฒฐ๊ณผ
10
3.2.2 Promise ๊ฐ์ฒด ์ฐ๊ฒฐ
then() ๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉด ์๋ก์ด Promise ๊ฐ์ฒด๊ฐ ๋ฐํ๋ฉ๋๋ค. ์ฆ, then() ๋ฉ์๋๋ฅผ ํ์ฉํ์ฌ ์ฌ๋ฌ Promise ๊ฐ์ฒด๋ฅผ ์ฐ๊ฒฐํ ์ ์์ผ๋ฉฐ, then() ๋ฉ์๋ ํ์ฉ ๊ฐ์ ์ ํ์ ์์ต๋๋ค. ์๋ ์์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ๋น๋๊ธฐ ๋ก์ง ์ฒ๋ฆฌ์ ์ฌ์ฉ๋๋ setTimeout() API๋ฅผ ํ์ฉํ์ฌ 2์ด ํ์ ์คํ๋์ด then() ๋ฉ์๋๊ฐ ์คํ๋ ๋๋ง๋ค ๊ฒฐ๊ด๊ฐ์ 1์ฉ ๋ํด์ฃผ๋ ๋ก์ง์ ๋๋ค.
function increment(){
return new Promise( (resolve) => {
setTimeout(function() {
resolve(1);
}, 2000);
})
.then(function(res) {
console.log(res); // 1
return ++res;
})
.then(function(res) {
console.log(res); // 2
return ++res;
})
.then(function(res) {
console.log(res); // 3
return ++res;
})
.then(function(res) {
console.log(res); // 4
return ++res;
})
.then(function(res) {
console.log(res); // 5
});
}
increment();
์คํ๊ฒฐ๊ณผ
1
2
3
4
5
3.3. Rejected(์คํจ)
3.3.1. ์๊ฐ
Promise ๊ฐ์ฒด์ ์ธ์์ธ reject๋ ํธ์ถ ์ ์คํจ(Rejected) ์ํ๊ฐ ๋ฉ๋๋ค.
new Promise(function(resolve, reject) {
reject();
});
resolve์ ๋ง์ฐฌ๊ฐ์ง๋ก, ์คํจ ์ํ๊ฐ ๋๋ฉด catch()๋ฅผ ํ์ฉํ์ฌ ๊ฒฐ๊ด๊ฐ์ ๋ฐ๊ณ ์์ธ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
function getData(){
return new Promise( (resolve, reject) => {
reject(new Error("This is rejected!"));
})
}
getData().catch((err) => console.log(err));
์คํ ๊ฒฐ๊ณผ
Error: This is rejected!
at C:\VSCode\Test01\sample01.js:3:14
at new Promise (<anonymous>)
at getData (C:\VSCode\Test01\sample01.js:2:12)
at Object.<anonymous> (C:\VSCode\Test01\sample01.js:7:1)
at Module._compile (node:internal/modules/cjs/loader:1101:14)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1153:10)
at Module.load (node:internal/modules/cjs/loader:981:32)
at Function.Module._load (node:internal/modules/cjs/loader:822:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
at node:internal/main/run_main_module:17:47
3.3.2. ํ์ฉ ์์
reject() ๋ฉ์๋๋ ์์ธ ๋ฐ์ ์ catch()๋ฅผ ํ์ฉํด ๊ฒฐ๊ด๊ฐ์ ๋ฐ๊ณ ์ฒ๋ฆฌํ ์ ์๋ค๊ณ ํ์ต๋๋ค.
Promise ๊ฐ์ฒด์์ ์กฐ๊ฑด์์ ๋ฐ๋ผ then() ๋ฉ์๋ ๋๋ catch() ๋ฉ์๋๋ฅผ ํ์ฉํ์ฌ ๋ก์ง์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
์๋๋ Promise ๊ฐ์ฒด์์ ์กฐ๊ฑด์์ ๋ฐ๋ผ ๋ค๋ฅธ ๊ฒฐ๊ด๊ฐ์ ์ถ๋ ฅํ๊ณ ์ด๋ค ๋ก์ง์ด ์ฒ๋ฆฌ๋์๋์ง ํ์ธํ๋ ๊ฐ๋จํ ์ฝ๋์ ๋๋ค.
* ์๋ ์ฝ๋๋ ๊ธฐ๋ณธ React ํ๋ก์ ํธ(์ฐธ๊ณ ) ๋ด App.js ํ์ผ์ ์์ ํ์ฌ ํ ์คํธํ ๊ฒฐ๊ณผ์ ๋๋ค.
import React, { Component } from 'react';
class App extends Component {
f1 = () => {
new Promise( (resolve, reject) => {
if ( 3 > 4 ){
resolve(100);
} else {
reject(200);
}
})
.then((result) => {
console.log("resolve: ", result);
})
.catch((result) => {
console.log("reject: " ,result);
})
}
render() {
return (
<div>
<button onClick={this.f1}>๋ฒํผ1</button>
</div>
);
}
}
export default App;
์คํ๊ฒฐ๊ณผ
์น ์์ ๋ฒํผ์ ํด๋ฆญํ ํ console์ ํ์ธํ๋ฉด reject ๋ฉ์๋๊ฐ ์คํ๋๋ ๋ก์ง์ ๋ฐ๋ฅธ ๊ฐ์ด ์ถ๋ ฅ๋๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
์ค๋์ ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋น๋๊ธฐ ๋ก์ง ์ฒ๋ฆฌ๋ฅผ ์ํ Promise ๊ฐ์ฒด์ ์ญํ ๊ณผ 3๊ฐ์ง ์ํ์ ๋ํด ์์๋ดค์ต๋๋ค.
ํฌ์คํ ๋ด์ฉ์ ์ค๋ฅ๊ฐ ์๋ค๋ฉด ํผ๋๋ฐฑ ๋๊ธ ํ์ํฉ๋๋ค.
๊ทธ๋ผ ์ค๋๋ ์ฆ๊ฒ๊ณ ๊ฑด๊ฐํ ํ๋ฃจ ๋ณด๋ด์๊ธธ ๋ฐ๋๋๋ค.
๊ณ ๋ง์ต๋๋ค :)