Stack/JavaScript

[JS] 동기 / 비동기 / 프로미스

7ingout 2022. 6. 15. 12:39

자바스크립트 비동기 처리
동기적처리(Synchronous)
비동기적처리(Asynchronous)

1. 콜백함수

2. Promise

자바스크립트에서 제공하는 비동기를 간편하게 처리할 수 있도록 도와주는 오브젝트입니다.

기능을 수행하고 나서 정상적으로 기능이 수행되면 성공의 메세지와 처리된 결과값을 전달

수행하다가 예상치 못한 결과가 생기면 에러를 전달해줍니다.

 

프로미스 상태

state: Promise가 수행중이면 pending

          수행이 종료되면 fullfilled

          수행중 오류가 발생 rejected

 

프로듀서와 컨슈머

프로듀서: Promise 제공

컨슈머: Promise 사용

 

 


 

synchronous.html

<!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>
</head>
<body>
    <script>
        // function work() {
        //     const start = Date.now();
        //     for(let i=0; i<1000000000; i++) {

        //     }
        //     const end = Date.now();
        //     console.log(end-start+'ms');
        // }
        function work(callback) {
            setTimeout(()=>{
                const start = Date.now();
                for(let i=0; i<1000000000; i++) {

                }
                const end = Date.now();
                console.log(end-start+'ms');
                callback();
            }, 0)
        }
        console.log('work 호출하기');
        work(()=>{
            console.log('작업이 끝났어요');
        });
        console.log('다음 작업');
    </script>
</body>
</html>

 

 

 

callback.html

<!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>
</head>
<body>
    <script>
        // function loadScript(src) {
        //     // script 태그를 만들고 페이지에 script 태그를 추가합니다.
        //     // 태그가 페이지에 추가되면 src에 있는 스크립트를 로딩하고 실행합니다.
        //     let script = document.createElement('script');
        //     script.src = src;
        //     document.head.append(script);
        // }
        // loadScript("myScript.js");
        // printHi();
        function loadScript(src, callback){
            let script = document.createElement('script');
            script.src = src;
            script.onload = () => callback();
            document.head.append(script);
        }
        loadScript("myScript.js", function() {
            printHi();
        })
    </script>
</body>
</html>

 

myScript.js

function printHi() {
    console.log("안녕 ~~ !!");
}

 

 

 

callback2.html

<!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>
</head>
<body>
    <script>
        console.log('1');
        setTimeout(()=>{
            console.log('2');
        }, 2000)
        // for(let i=0; i<1000000000; i++) {
        // }
        // console.log('2');
        // console.log('3');
        
        function printConsole() {
            console.log("자바스크립트 콜백 !")
        }
        
        // Synchronous 콜백 실습
        function printImmediately(print) {
            print();
        }
        printImmediately(printConsole);

        // asynchronous 콜백 실습
        function printWithDelay(print, timeout) {
            setTimeout(print, timeout);
        } 
        printWithDelay(printConsole, 2000);
    </script>
</body>
</html>

 

 

 

promise.html

<!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>
</head>
<body>
    <script>
        // 1. 프로미스 프로듀서
        const promise = new Promise((resolve, reject)=>{
            console.log('수행중......');
            setTimeout(()=>{
                resolve("성공한 결과");   // resolve 실행 뜸
                // reject("에러발생");    // reject 실행 뜸
                // reject(new Error('찾을 수 없어'));
            },2000)
        });

        console.log(promise);
        // 2. 프로미스 컨슈머 then, catch, finally
        // promise.then(value=>{
        //     console.log(value);
        // })
        // promise.then(
        //     // function(a){
        //     //     console.log('resolve 실행')
        //     //     console.log(a)
        //     // },   // 결과를 다룹니다.
        //     (a)=>console.log(a),
        //     // function(e){
        //     //     console.log('reject 실행')
        //     //     console.log(e)
        //     // }   // 에러를 다룹니다.
        //     e=> {
        //         console.log('reject 실행')
        //         console.log(e)
        //     }
        // )

        // 성공한 결과는 then이 처리 실패하면 catch가 처리
        promise.then(value=>{
            console.log(value);
        })
        .catch(error => {
            console.log(error);
        }).finally(()=>{
            console.log("끝났어요");
        })
    </script>
</body>
</html>