ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2023 - 05 - 27 콜백함수 ; promise, 리팩토링
    Today I Learned/TIL 05 2023. 6. 1. 07:24

    오늘 할일


    1. 4강 마무리, 5강 끝내기. 주차별 문제 다 풀기
    2. 개인과제 다시 오늘꼭 하기.
    3. 프로그래머스 문제 풀기.
    4. 알고리즘 1,2,3강 다시 듣고 블로그 정리하기

     

    오늘 배운것

    비동기적 작업의 동기적 표현 - promise함수, 리팩토링, 제너레이

     

    1. Promise 함수

     

    - Promise는 말 그대로 약속 이라는 뜻. 어떤 값이 준비되면 실행할게 라는 약속. resolve 또는reject와 함께 쓰인다.

    - new 연산자로 호출한 Promise의 인자로 넘어가는 콜백은 바로 실행된다.
    - 그 내부의 resolve(실행) (또는 reject(거절)) 함수를 호출하는 구문이 있을 경우 
    resolve(또는 reject) 둘 중 하나가 실행되기 전까지는 다음(then), 오류(catch)로 넘어가지 않는다.
    - 따라서, 비동기작업이 완료될 때 비로소 resolve, reject 를 호출한다.

    resolve가 실행되기 전까지는 다음으로 넘어가지 않는다. 즉 resolve가 실행되면 then으로 넘어간다.
    .then은 promise 괄호가 끝나고 붙인다.

     

    setTimeout함수를 활용하여 에스프레소를 1초뒤 생성하도록 만듦.

    여기서 resolve(name)은 위 함수에서 이름값을 받음.

    new Promise(function(resolve){
        setTimeout(function(){
            var name = "에스프레소"
            console.log(name)
            resolve(name)
        }, 1000);
    })

     

    그러면 이 promise 함수를 이어 붙이는 법.

     

    new Promise(function(resolve){
        setTimeout(function(){
            var name = "에스프레소"
            console.log(name)
            resolve(name)
        }, 1000);
    }).then(function(previousName){
        return new Promise(function(resolve){ 
            setTimeout(function(){               
                var name = previousName + ", 아메리카노"
                console.log(name)
                resolve(name)
            }, 1000);
        })
    })
    
    // return문은 앞에 new Promise함수를 그대로 다 갖다 붙이고, var name만 변경한다.
    // 이렇게 이어붙이는 로직은 그 뒤론 완전 똑같다.

    return문은 앞에 new Promise함수를 그대로 다 갖다 붙이고, var name만 변경한다.
    이렇게 이어붙이는 로직은 그 뒤론 완전 똑같다.

     

    new Promise(function(resolve){
        setTimeout(function(){
            var name = "에스프레소"
            console.log(name)
            resolve(name)
        }, 1000);
    }).then(function(previousName){
        return new Promise(function(resolve){ 
            setTimeout(function(){
                var name = previousName + ", 아메리카노"
                console.log(name)
                resolve(name)
            }, 1000);
        })
    }).then(function(previousName){
        return new Promise(function(resolve){ 
            setTimeout(function(){
                var name = previousName + ", 카페모카"
                console.log(name)
                resolve(name)
            }, 1000);
        })
    }).then(function(previousName){
        return new Promise(function(resolve){ 
            setTimeout(function(){
                var name = previousName + ", 녹차라떼"
                console.log(name)
                resolve(name)
            }, 1000);
        })
    })
    
    // 에스프레소
    // 에스프레소, 아메리카노
    // 에스프레소, 아메리카노, 카페모카
    // 에스프레소, 아메리카노, 카페모카, 녹차라떼

     

    2. 리팩토링

    비효율적인 코드를, 효율적인 코드로 변경하는 작업

    계속 반복되는 작업들을 함수화시키기.

     

    var addCoffee = function (name) {
        return function(previousName){
            return new Promise(function(resolve){ 
                setTimeout(function(){
                  
                    var newName = previousName + ", " + name;
                    console.log(newName)
                    resolve(newName)
                }, 1000);
            })
        }
    }
    addCoffee("에스프레소")

    매개변수 name은 계속 추가해줘서 변경되는 요소 입력 (아메리카노, 카페모카, 카페라뗴..)

    반복시켜야 하는 문구에 백틱을 이용해 문자열안에 ${ } 넣을수도 있음.

     

    var addCoffee = function (name) {
        return function(previousName){ //
            return new Promise(function(resolve){ 
                setTimeout(function(){
                  
                    var newName = `${PreviousName}, ${name}` 
                    // 백틱을 이용해서 문자열 지정 가능. 그 문자열안에 변수 ${ } 지정 가능.
                    console.log(newName)
                    resolve(newName)
                }, 1000);
            })
        }
    }
    addCoffee("에스프레소")

     

    삼항연산자를 이용하여, 중복값 제거 가능

    (이전에 이름이 있을경우, 추가. 없을경우, 이름을 처음 입력)

     

    var addCoffee = function (name) {
        return function(previousName){ //
            return new Promise(function(resolve){ 
                setTimeout(function(){
                  
                    var newName = PreviousName ? `${PreviousName}, ${name}` : name;
                    console.log(newName)
                    resolve(newName)
                }, 1000);
            })
        }
    }
    addCoffee("에스프레소")()
        .then(addCoffee("아메리카노"))
        .then(addCoffee("카페라떼"))
        .then(addCoffee("녹차라떼"));

    댓글

Designed by Tistory.