jineecode

promise 본문

JS

promise

지니코딩 2021. 4. 27. 12:14
function delay(sec, callback) {
    setTimeout(() => {
            callback(new Date().toISOString());
        }, sec * 1000);
}

        
console.log('start', new Date().toISOString());
    
delay(1, (result) => {
        console.log(1, result);
});

console.log('hello');

 

function delay(sec, callback)

delay라는 함수에 sec, callback 이라는 파라미터를 넣어줌.

그 안에 callback과 sec이 써여진 것을 볼 수 있다.

(이는 정해진 메소드가 아니라 우리가 정한 것. 꼭 delay나 sec, callback이 아니어도 작동한다.)

 

콘솔의 'start', new Date().toISOString() 이후에 

 

delay에 파라미터 값을 넣어준다.

delay(1, (result) => {
        console.log(1, result);
});

1초 뒤에 출력하기 위하여,

파라미터에 1과 그 결과인 result를 넣어준 것이다.

 

이후 hello가 찍힌다.

 

//

 

start 2021-04-27T01:35:37.287Z

hello

1 "2021-04-27T01:35:38.288Z"

 

//

 

1초씩 new Date를 찍고 싶으면 어떻게 해야 할까?

 

...

delay(1, (result) => {
        console.log(1, result);
});

delay(1, (result) => {
    console.log(2, result);
});

delay(1, (result) => {
    console.log(3, result);
});

 

이렇게 하면 될 것 같지만 비동기이므로 의도와는 다르게 동시다발적으로 찍히게 된다.

 

그렇다면 어떻게 해야 할까?

 

가장 손쉬운 방법은 콜백 안에 넣는 방법이 있다.

 

delay(1, (result) => {
    console.log(1, result);
    
    delay(1, (result) => {
        console.log(2, result);

        delay(1, (result) => {
            console.log(3, result);
        });
    });
});

 

첫 번째 delay가 실행되고 첫 번째 delay 안에 있는 console.log(1, result)를 실행하고 나면, 그 다음 두 번째 delay가 실행되어 다시 1초를 부르게 되는 로직.

 

이것은 콜백지옥을 야기할 뿐더러 가독성도 좋지 않다.

 

이때 promise를 이용해본다.

 


 

delayP(1).then((result) => {
    console.log(1, result);
})

실행에 필요한 옵션을 파라미터로 넘기고, .then으로 결과를 받을 콜백을 넘기는 코드

위 코드와 비슷해보이지만 뭔가 다르다.

 

then 이라는 메소드가 보이는데, then 메소드는 promise의 인스턴스다.

 

이제 delayP()를 만들어보자

 

function delayP(sec) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(new Date().toISOString());
        }, sec * 1000);
    });
    // resolve 할일을 다했을 때 호출
    // reject 할일을 하다가 에러, 예외가 일어났을 때 호출
}

 

delayP가 실행될 때, resolve가 매개변수로 들어가면 1초 뒤 Date가 찍히는 것이다.

 

그럼, 1초, 2초, 3초를 찍으려면 어떻게 해야 할까?

 

delayP(1).then((result) => {
    console.log(1, result);

    delayP(1).then((result) => {
        console.log(2, result);

        delayP(1).then((result) => {
            console.log(3, result);
        })
    })
    
})

이렇게 코드를 쓰면 처음과 다를 게 없다.

아래와 같이 return을 해준다.

delayP(1).then((result) => {
    console.log(1, result);
    return delayP(1);
}).then((result) => {
    console.log(2, result);
});

return : 첫번째 then에서 return 하는 값이 resolve 즉, 성공적으로 출력을 해야만 그 다음 콜백이 실행되는 것이다.

 

delayP(1).then((result) => {
    console.log(1, result);
    return delayP(1);
}).then((result) => {
    console.log(2, result);
    return delayP(1);
}).then((result) => {
    console.log(3, result);
}).then((result) => {
    console.log(result);
});

3번째 then 아래에 return값이 없다면 undefined가 나온다.

 

delayP(1).then((result) => {
    console.log(1, result);
    return delayP(1);
}).then((result) => {
    console.log(2, result);
    return delayP(1);
}).then((result) => {
    console.log(3, result);
    return '끝'
}).then((result) => {
    console.log(result);
});

//

 

 

'JS' 카테고리의 다른 글

Javascript 정렬 함수  (0) 2021.04.29
async / await  (0) 2021.04.27
싱글스레드 자바스크립트.  (0) 2021.04.26
스코프 & 클로저  (0) 2021.04.26
지역 선택 JS로 제어하기  (2) 2021.02.26
Comments