Loading...

JavaScript / / 2022. 3. 15. 00:11

자바스크립트 5강. promise

반응형

 

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

 

반응형