JavaScript

자바스크립트 5강. promise

JJJAEOoni 2022. 3. 15. 00:11
반응형

 

pending은 대기하다 라는 뜻이다.

 

Prototype은 원형이라고 생각하면 된다.

 

Promise는 버퍼가 끝까지 다운로드할 때까지 pending중인 것이다.

이게 fulfilled이다.

 

우리가 받을 데이터가 1, 2, 3, 4이니까

모든 데이터가 버퍼를 꽉 채울때까지 pending상태인 것이다.

 

4가 끝이라는 건 어떻게 알까?

데이터가 끝이라는 자기들만의 프로토콜이 있을 것이다.

우린 몰라도 된다.

 

결과의 타입이 Response라는 타입이다.

결과를 Response 타입으로 받을 수 있다는 말인데

자바스크립트는 타입이 따로 없으니 신경 쓰지 않아도 된다.

 


 

pending 상태에 데이터를 던지면 어음을 준다.

데이터는 나중에 줄테니까 일단 이거부터 받아! 인 것이다.

빈 박스를 먼저 준다.

 

이게 promise 박스인 것이다.

박스 안에 null인지 뭐가 들어있는지는 까 보기 전에 아무것도 모른다.

 

그렇다면 promise의 pending은 언제 사라질까?

버퍼가 fulfilled 되면 사라진다.

 

promise는 약속을 무조건 지키기 때문에 pending이 끝나면

무조건 데이터를 넘겨준다.

 

fetch가 다운로드하는 동안, pending 시간이 언제 끝날지 모른다.

확신할 수 없다.

 

그렇기 때문에 문법을 하나 제공해준다.

 


 

pending이 끝날 때까지 기다리는 문법이 있다.

 

await : cpu야 다운로드가 다될 때까지 기다려!

 

이렇게 되면 cpu가 다운로드가 끝날 때까지 멍 때리게 된다.

프로그램이 멈춰버리게 되는 것이다.

 

이를 해결하기 위해 async를 붙여준다.

비동기(Asynchronous) 함수가 되는 것이다.

 

async가 붙는 순간 await에서 기다리지 않고

체크포인트로 잡은 후 이벤트 큐에 저장해둔다.

 

이벤트 큐에는 다음과 같이 저장된다.

 

1. 29번 라인 나중에 확인하기

 

메인 스레드가 다른 일을 다 마친 후

한가할 때 이벤트 큐를 확인하고 체크 포인트를 가서 확인한다.

 

fulfilled가 끝났는지 확인하는 것이다.

 

메인스레드가 바쁘면 이벤트 큐에 가지 않는다!!

 

확인해서 다 안 끝났네? 나중에 다시 와야지

끝났네? 데이터 받아준다.

 

비동기라서 일의 순서가 없으니까 똑똑하게 일할 수 있는 것이다.

 

이런 단일 스레드 기반 프로그래밍은 promise가 없으면 동시성 처리를 못한다.

 

NoN-Blocking-IO 서버 : 단일 스레드 기반

 

이 시스템을 위해서는 promise가 필요하다.

 

보통 I/O가 발생할 때 await, async를 사용한다.

await에서 블락당한 cpu를 함수로부터 해방시켜주는 게 async이다.

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .box {
            border: 1px solid black;
            padding: 10px;
        }

        .item_box {
            border: 1px solid grey;
            padding: 5px;
            background-color: aliceblue;
        }
    </style>
</head>
<body>
    <h1>통신으로 데이터 가져와서 그림 그리기</h1>
    <hr />
    <!-- 데이터 뿌릴 곳 -->
    <div id="number-box" class="box">

    </div>

    <button id="download">다운로드</button>

    <script>

        // ajax 사용이유 (1) 부분 리로드 (2) delete, put 요청 가능

        async function numberFetch() {
            let response = await fetch("http://localhost:8080/number"); // 다운로드 함수
            // console.log(response);
            let responseParse = await response.json(); // json -> JS 오브젝트 파싱
            // console.log(responseParse);

            let numberBoxDom = document.querySelector("#number-box");
            for(let i of responseParse) {
                let pDom = document.createElement("p");
                pDom.className = "item_box";
                pDom.innerHTML = `<b>${i}</b>`;
                numberBoxDom.appendChild(pDom);
            }
        }

        let downDom = document.querySelector("#download");
        downDom.addEventListener("click", () => {
            numberFetch();   
        })
    </script>
</body>
</html>

 

자바스크립트에서 백틱을 쓰면 변수 바인딩이 가능하다.

 

최대 단점 자바스크립트로 html 디자인해야 함

 

AJAX(Asynchronous JavaScript And XML) : 비동기 자바스크립트 통신 방법

 

put과 delete 요청하기 위해, 부분 리로드 하기 위해 배우는 것이다!

html만 가지고는 get, post 요청밖에 못하고 부분 리로드가 불가능하니까!

 

 

 

 

[출처]

 

https://cafe.naver.com/metacoding

 

메타코딩 : 네이버 카페

코린이들의 궁금증

cafe.naver.com

메타 코딩 유튜브

https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9

 

메타코딩

문의사항 : getinthere@naver.com 인스타그램 : https://www.instagram.com/meta4pm 깃헙 : https://github.com/codingspecialist 유료강좌 : https://www.easyupclass.com

www.youtube.com

 

반응형