[JS] Promise / Async / 에러 핸들링 복습

2022. 6. 30. 10:40·Stack/JavaScript

Promise new Promise 선언할 때 P 대문자로 적을 것 !

Async는 Promise를 간편하게? 쓰도록 해주는 애

에러 핸들링

try...catch 문법

 

try {

                코드작성

}

catch(e) {

                코드작성

}

 


 

복습/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>
        // 프로미스 생성
        const promise = new Promise((resolve, reject)=> {
            console.log("수행중...");
            setTimeout(()=> {
                // resolve("안녕안녕안녕");
                reject(new Error('not found'));
            }, 2000)
        })

        // 프로미스 사용
        promise.then(value=>console.log(value))
        .catch(error=>console.log(error))
        .finally(()=>{
            console.log("끝났어요");
        })


        
        // function fetchUser() {
        //     return new Promise((resolve, reject)=>{
        //         // resolve("프로미스 성공"); // 프로미스는 fulfilld 상태가 됨
        //         reject(new Error('dddd'));
        //         // return "green";
        //     })
        // }
        // // resolve나 reject가 호출되어야 프로미스는 끝이 남
        // const user = fetchUser();
        // console.log(user);



        const fetchNumber = new Promise((resolve, reject)=> {
            setTimeout(()=>resolve(1),1000)
        })

        // then은 값을 전달할 수도 있고 또 다른 프로미스도 전달할 수 있음
        fetchNumber.then(num => num *2)
        .then(num => num *3)
        .then(num => {
            return new Promise((resolve, reject)=> {
                setTimeout(()=>resolve(num-1), 1000)
            })
        }).then(num => console.log(num));



        function getHen(){
            return new Promise((resolve, reject)=> {
                setTimeout(()=>resolve('암닭'), 1000)
            })
        }
        function getEgg(){
            return new Promise((resolve, reject)=>{
                setTimeout(()=>reject(new Error('계란을 받아올 수 없어')),1000)
            })
        }
        function cook(egg) {
            return new Promise((resolve, reject)=> {
                setTimeout(resolve(egg+'후라이'),1000)
            })
        }
        getHen()
        .then(getEgg)
        .catch(error=> {
            return '햄'
        }).then(cook).then(console.log);



        // Async를 함수 앞에 적으면 프로미스를 쓰지 않아도 함수 안에 블럭이 프로미스로 적용됨
        // await
        // async가 붙은 함수안에서만 사용할 수 있음
        function delay(ms) {
            return new Promise((resolve, reject)=> setTimeout(resolve,ms));
        }
        async function getApple() {
            await delay(2000);
            return '사과';
        }
        async function getBanana() {
            await delay(2000);
            return '바나나';
        }
        async function pickFruits() {
            const apple = await getApple();
            const banana = await getBanana();
            return `${apple}+${banana}`;
        }
        pickFruits().then(console.log);



        // 함수 앞에 async가 붙으면 해당 함수는 항상 프로미스를 반환
        // 프로미스가 아닌 것을 프로미스로 감싸서 반환
        async function asyfu() {
            return 1;
        }
        asyfu().then(console.log);
        async function asyfu2(){
            return Promise.resolve(1);
        }
        asyfu2().then(console.log);

        // await은 async가 붙어있는 함수 안에서만 사용 가능
        // await 프로미스가 처리될 때까지 기다림
        // await은 async 키워드가 있는 함수 안에서만 사용 가능 !!
        async function promiseF() {
            let promise = new Promise((resolve, reject)=> {
                setTimeout(()=>resolve("완료!"), 1000)
            });
            let result = await promise;
            // await promise 하면 promise가 하는 일 다 끝내고 result에 담아줌 (위의 예시에서는 1초 뒤)
        }


        // 에러 핸들링
        // async function f(){
        //     await Promise.reject(new Error("에러발생!!!!"));
        // }
        // async function f(){
        //     throw new Error("에러발생!!!!");
        // }
        async function f() {
            try{
                let response = await fetch('유효하지않은 주소');
            }
            catch(e){
                cosnole.log(e);
            }
        }
    </script>
</body>
</html>

 

복습/error.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>
        // try {
        //     alert('try 블럭 실행');
        //     green; // 선언되지도 않은 green 호출 해서 에러 만들기
        // }
        // catch(e) {
        //     alert('catch 블럭 실행');
        // }

        let json = '{"name""green", "age":30}';
        try {
            let user = JSON.parse(json);
            console.log(user.name);
            console.log(user.age);
        }
        catch(e) {
            console.log("데이터에 에러가 있어 재요청을 합니다.");
        }
  

        let json2 = '{"age": 20}';
        try {
            let user2 = JSON.parse(json);
            // console.log(user2.name);
            // 이름이 없으므로 에러가 발생
            if(!user2.name) {
                throw new SyntaxError("불완전한데이터: 이름없음");
            }
        }
        catch(e) {
            console.log('catch 실행');
            console.log(e.name);
            console.log(e.message);
        }

        // throw 연산자 - 에러처리를 통보
        // trhow <error object>
        // 자바스크립트 에러 객체 생성자
        // Error, SyntaxError, ReferenceError, TypeError
        let error = new Error("에러가 생겼어요");
        // new SyntaxError(message);
        // new ReferenceError(message);
        console.log(error);
        console.log(error.name);
        console.log(error.message)
    </script>
</body>
</html>

 

'Stack > JavaScript' 카테고리의 다른 글

[JS] 2022 데브매칭 상반기 - 프로그래밍 언어 검색  (0) 2022.08.22
[JS] 생성자 함수 복습  (0) 2022.08.22
[JS] Wave  (0) 2022.06.20
[JS] JumpGame  (0) 2022.06.17
[JS] Network  (0) 2022.06.17
'Stack/JavaScript' 카테고리의 다른 글
  • [JS] 2022 데브매칭 상반기 - 프로그래밍 언어 검색
  • [JS] 생성자 함수 복습
  • [JS] Wave
  • [JS] JumpGame
7ingout
7ingout
  • 7ingout
    Hello, 7ingout world!
    7ingout
  • 전체
    오늘
    어제
    • 분류 전체보기 (205)
      • Project (5)
      • Stack (173)
        • React (40)
        • JavaScript (50)
        • TypeScript (14)
        • HTML (11)
        • CSS (31)
        • Spring (9)
        • PHP (15)
        • SQL (3)
        • Python (0)
      • ETC (9)
      • Design (13)
        • Illustrator (6)
        • Photoshop (7)
      • Articloid (4)
        • 7ingout (4)
  • 공지사항

    • ☻
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
7ingout
[JS] Promise / Async / 에러 핸들링 복습
상단으로

티스토리툴바