Recent Posts
Recent Comments
Archives
๋ฐ˜์‘ํ˜•
250x250
ยซ   2024/05   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
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 29 30 31
Today
Yesterday

Total
05-05 03:02
๊ด€๋ฆฌ ๋ฉ”๋‰ด

Hey Tech

[React] Promise ์—ญํ•  ๋ฐ ์ƒํƒœ(pending, resolve, reject) ๋ณธ๋ฌธ

SW ๊ฐœ๋ฐœ/React JS

[React] Promise ์—ญํ•  ๋ฐ ์ƒํƒœ(pending, resolve, reject)

Tony Park 2021. 12. 14. 22:15
728x90
๋ฐ˜์‘ํ˜•

๐Ÿ”ฅ ๋ชฉํ‘œ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(๋ฆฌ์•กํŠธ)์—์„œ 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๊ฐ€์ง€ ์ƒํƒœ์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์Šต๋‹ˆ๋‹ค.

ํฌ์ŠคํŒ… ๋‚ด์šฉ์— ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋‹ค๋ฉด ํ”ผ๋“œ๋ฐฑ ๋Œ“๊ธ€ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ์˜ค๋Š˜๋„ ์ฆ๊ฒ๊ณ  ๊ฑด๊ฐ•ํ•œ ํ•˜๋ฃจ ๋ณด๋‚ด์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๊ณ ๋ง™์Šต๋‹ˆ๋‹ค :)

728x90
๋ฐ˜์‘ํ˜•
Comments