기은P
시간이 멈추는 장소
기은P
  • Programming (272)
    • 개발노트 (1)
    • FrontEnd (56)
      • ES&JS 문법 (14)
      • HTML&CSS (4)
      • React 기본 (18)
      • React 심화 (12)
      • React 이슈 (2)
      • Project 연습 (1)
      • Next.js (5)
    • Backend&Devops (33)
      • AWS (2)
      • Docker (9)
      • Jenkins (6)
      • Nginx (6)
      • Node.js (1)
      • ElasticSearch (5)
      • 프레임워크&아키텍처 (2)
      • 암호화 (0)
      • 기타 (2)
    • 알고리즘 (3)
    • C# (8)
      • WPF (8)
    • Java (51)
      • 순수 Java (18)
      • RDF&Jena (12)
      • RCP&GEF (9)
      • JMX (5)
      • JMapper (3)
      • 오류해결 (4)
    • Database (21)
      • RDBMS (9)
      • NoSQL (2)
      • TSDB (1)
      • GraphQL (1)
      • Hibernate (3)
      • 데이터베이스 이론 (4)
      • Redis (1)
    • 프로토콜 (11)
      • Netty (4)
      • gRPC (5)
      • 프로토콜 개념 (2)
    • Server (4)
      • Linux (4)
    • 2020 정보처리기사 필기 (43)
      • 목차 (1)
      • 기출문제 (1)
      • 1과목 - 소프트웨어 설계 (6)
      • 2과목 - 소프트웨어 개발 (7)
      • 3과목 - 데이터베이스 구축 (8)
      • 4과목 - 프로그래밍 언어 활용 (7)
      • 5과목 - 정보시스템 구축 관리 (10)
    • 2020 정보처리기사 실기 (31)
      • 목차 (4)
      • 기출예상문제 (19)
      • 실기요약 (8)
    • 빅데이터분석기사 필기 (4)
      • 목차 (0)
      • 필기 요약 (3)
    • 전기 공학 (1)
      • CIM (1)
    • 산업자동화시스템 (3)
      • SCADA (1)
      • OPC UA (2)
    • 디자인패턴 (1)
    • 휴지통 (0)

공지사항

  • 공지사항/포스팅 예정 항목

최근 댓글

최근 글

전체 방문자
오늘
어제

티스토리

hELLO · Designed By 정상우.
기은P

시간이 멈추는 장소

[React] Promise란?
FrontEnd/React 심화

[React] Promise란?

2022. 3. 7. 21:08
반응형

1. Promise란?

 

React에서 Promise는 비동기 처리에 활용되는 객체입니다. Promise는 주로 웹 서비스를 구현할 떄 원활한 데이터 통신을 위해 활용됩니다.

웹 페이지에서 서버로 데이터를 요청했을 때, 데이터를 모두 받기 전에 웹에 출력하려고 하는 경우를 방지하기 위해 활용됩니다. 즉, Promise 객체는 비동기 로직을 마치 동기처럼 사용할 수 있는 기능을 가집니다.

예를 들어 비동기 로직인 A, B, C 로직이 있다고 했을때 이를 Promise를 사용하지 않고 실행시키면 먼저 로직이 끝나는 순서로 출력이 되지만, Promise를 사용하면 A, B, C 순서대로 출력을 시킬 수 있습니다.

 

 

 

2. Promise의 상태

Promise의 상태는 아래의 3가지 상태와 같습니다.

Pending(대기) 비동기 로직 처리의 미완료 상태
Fulfilled(이행) 비동기 로직 처리가 완료된 상태로 Promise 결과값 반환 상태
Rejected(실패) 비동기 로적 처리의 실패 또는 오류 상태

 

 

 

 

 

2-1. Pending

new Promise();

new Promise((resolve, reject) => {});

위와 같이 Promise 객체를 생성하면 대기 상태입니다. 인자는 resolve(실행)와 reject(실패)를 가집니다.

 

 

2-2. Fulfilled

// resolve()를 통해 Promise 실행
function getData(){
    return new Promise( (resolve, reject) => {
      let data = 10;
      resolve(data);
    })
  }
  
getData().then((resolvedData) => console.log(resolvedData));

2-1에서 Promise 객체를 생성하고 resolve에 parameter를 넣어주면 Promise가 이행상태로 넘어갑니다.

이후 then()을 활용하면 결과 값을 받을 수 있습니다.

 

 

2-3. Rejected

//reject를 호출해 고의적 실패로 연결
function getData(){
    return new Promise( (resolve, reject) => {
      reject(new Error("This is rejected!"));
    })
  }
  
getData().catch((err) => console.log(err));

Promise 객체인 reject인자는 호출 시 실패 상태가 됩니다.

이후 catch()를 활용하면 결과값을 받고 예외를 확인할 수 있습니다.

 

 

3. API 호출(Get) feat.Typescript

CandleTrade는 Type형태로 작성했습니다. 바이낸스 api를 이용해 코인 데이터를 가져오는 코드입니다.

import { useEffect, useState } from "react";

export type CandleTrade = {
  date: number[];
  open: number[];
  close: number[];
  high: number[];
  low: number[];
  closetime: string[];
  assetvolume: number[];
  basevolume: number[];
  quotevolume: number[];
};

const [candleData, setChartCandle] = useState<CandleTrade>({

useEffect(() => {
    async function getCoinCandle() {
      try {
        const response = await axios.get(
          'https://api.binance.com/api/v3/klines?symbol=BTCEUR&interval=1d&limit=500'
        );
        let tempList: CandleTrade = {
          date: [],
          open: [],
          close: [],
          high: [],
          low: [],
          closetime: [],
          assetvolume: [],
          basevolume: [],
          quotevolume: [],
        };

        for (var i = 0; i < response.data.length; ++i) {
          tempList.date.push(response.data[i][0]);
          tempList.open.push(response.data[i][1]);
          tempList.close.push(response.data[i][2]);
          tempList.high.push(response.data[i][3]);
          tempList.low.push(response.data[i][4]);
          tempList.closetime.push(response.data[i][5]);
          tempList.assetvolume.push(response.data[i][6]);
          tempList.basevolume.push(response.data[i][7]);
          tempList.quotevolume.push(response.data[i][8]);
        }

        setChartCandle(tempList);

      } catch (e) {
        console.log(e)
      }

    };
    getCoinCandle();
  }, []);

 

 

4. 활용

var promiseCount = 0;

function testPromise() {
    var thisPromiseCount = ++promiseCount;

    var log = document.getElementById('log');
    log.insertAdjacentHTML('beforeend', thisPromiseCount +
        ') 시작 (<small>동기적 코드 시작</small>)<br/>');

    // 새 프로미스 생성 - 프로미스의 생성 순서를 전달하겠다는 약속을 함 (3초 기다린 후)
    var p1 = new Promise(
        // 실행 함수는 프로미스를 이행(resolve)하거나
        // 거부(reject)할 수 있음
        function(resolve, reject) {
            log.insertAdjacentHTML('beforeend', thisPromiseCount +
                ') 프로미스 시작 (<small>비동기적 코드 시작</small>)<br/>');
            // setTimeout은 비동기적 코드를 만드는 예제에 불과
            window.setTimeout(
                function() {
                    // 프로미스 이행 !
                    resolve(thisPromiseCount);
                }, Math.random() * 2000 + 1000);
        }
    );

    // 프로미스를 이행했을 때 할 일은 then() 호출로 정의하고,
    // 거부됐을 때 할 일은 catch() 호출로 정의
    p1.then(
        // 이행 값 기록
        function(val) {
            log.insertAdjacentHTML('beforeend', val +
                ') 프로미스 이행 (<small>비동기적 코드 종료</small>)<br/>');
        })
    .catch(
        // 거부 이유 기록
        function(reason) {
            console.log('여기서 거부된 프로미스(' + reason + ')를 처리하세요.');
        });

    log.insertAdjacentHTML('beforeend', thisPromiseCount +
        ') 프로미스 생성 (<small>동기적 코드 종료</small>)<br/>');
}

if ("Promise" in window) {
  var btn = document.getElementById("btn");
  btn.addEventListener("click", testPromise);
} else {
  log = document.getElementById('log');
  log.innerHTML = "Live example not available as your browser doesn't support the <code>Promise<code> interface.";
}

 

보통 axios나 thunk와 같은 api를 호출할 때 promise를 통해 호출하곤 합니다.

 

 

 

 

 

 

반응형
저작자표시 변경금지 (새창열림)

'FrontEnd > React 심화' 카테고리의 다른 글

[React] Redux Toolkit 사용법  (1) 2022.09.19
[React] Redux 사용하기(2) - 카운터 구현  (0) 2022.06.21
[React] Redux 사용하기(1) - 개념과 흐름  (0) 2022.06.21
[React] Immer (produce)  (0) 2022.04.04
[React] Async & Await란?  (0) 2022.03.07
    'FrontEnd/React 심화' 카테고리의 다른 글
    • [React] Redux 사용하기(2) - 카운터 구현
    • [React] Redux 사용하기(1) - 개념과 흐름
    • [React] Immer (produce)
    • [React] Async & Await란?
    기은P
    기은P
    기은P의 블로그 일상과 개발 관련 포스팅 #React #Typescript #Next #Nest https://github.com/kimdongjang

    티스토리툴바