FrontEnd_JavaScript

[JavaScript] 비동기(Asynchronous) 처리 - Promise (1)

wookjae 2021. 10. 13. 01:18

* 동기(Synchronous), 비동기(Asynchronous) ?

--> 동기적 처리는 요청(REQUEST)에 대한 응답(RESPONSE)을 받을 때까지 다른 작업을 수행 할 수 없다.

하나의 작업이 수행되는 동안 다른작업들은 대기상태가되며 순차적으로 처리된다. 반면에 비동기적 처리는 요청에 대한 응답결과와 관계없이 여러작업을 동시적으로 수행이 가능하며, 기다리는 과정에서 다른함수 호출도 가능하다.

 

* Javascript Promise (ES6) ?

--> 자바스크립트의 비동기처리 방식이며, 객체형태로 선언 및 사용된다. "new Promise();"  

프로미스(Promise)는 수행결과에 따른, CallBack함수(성공, 실패) 분기처리가 가능하다.

 

* Promise States ?

Pending(대기) 비동기처리 로직이 완료되지 않은 대기상태
Fulfilled(이행) 비동기처리 로직이 완료된 상태
Rejected(거부) 비동기처리 실패 또는 오류가 발생한 상태

 

* Promise 구조 ?

--> 생성자를 통해서 Promise객체를 만든다. 인자로 Executor Function을 선언한다.

new Promise( Executor Function );   * 생성자를 통하여 프로미스 객체생성시, pending(대기상태).

Executor Function: 콜백함수(CallBack Function)이며 2개의 파라미터 "resolve", "reject"를 가진다.
 - resolve : 프로미스 상태를 Fulfilled(이행) 상태로 변경하는 함수
 - reject   : 프로미스 상태를 Reject(거부) 상태로 변경하는 함수

Cf). 
(resolve, reject) => { 

   // resolve 펑션수행시 Fulfilled.. 상태로 진입 
   resolve();


   // reject 펑션수행시 Reject.. 상태로 진입  

   reject();
}

.then(CallBackFn)  :: Fulfilled되었을시 호출되는 SuccessFn
.catch(CallBackFn) :: Reject되었을시 호출되는 FailFn

 

 


 (Asynchronous) Promise Exercise..

 

// Promise 객체생성 -- Pending(대기) 상태.
new Promise((resolve, reject) => {}); 

// resolve함수 실행 , Fulfilled(이행) 상태.
new Promise((resolve, reject) => {

    resolve(); 
});

// reject함수를 실행 , Rejected(거부) 상태.
new Promise((resolve, reject) => {

    reject();  
});

// 프로미스객체 3000ms(==3Sec) 이후, Fulfilled(이행) 상태.
const pObj = new Promise((resolve, reject) => {

    /** pending.. (대기상태) */

    setTimeout(() => {

        resolve();
    }, 3000);
});

// 프로미스 결과 - Fulfilled(이행) CallBack Function수행..

pObj.then(() => { 
    console.log('Promise Fulfilled..!..'); 
    console.log('Success Return.. After 3Sec'); 
}); 

// 프로미스객체 5000ms(==5Sec) 이후, Rejected(거부) 상태.
function createPromise() {

    return new Promise((resolve, reject) => {

        /** pending.. (대기상태) */

        setTimeout(() => {

            reject();  
        }, 5000);
    });
}

// 프로미스 결과 - Rejected(거부) CallBack Function수행..
createPromise() 
   .then(() => {   // CallBack - SuccessFn 
       console.log('Promise Fulfilled..!'); 
   }) 
   .catch(() => {   // CallBack - FailFn 
       console.log('Promise Rejected..!'); 
   }); 
// 프로미스객체 1000ms(==1Sec) 이후, Fulfilled(이행) 상태.
function createPromise2() {

    return new Promise((resolve, reject) => {

        /** pending.. (대기상태) */

        setTimeout(() => {

           resolve('Hello Promise..'); 
           // reject('Biz Error!!'); 

        }, 1000);
    });
}

// 프로미스 결과 - Fulfilled(이행) CallBack Function수행..
// msg == "Hello Promise"

createPromise2() 
   .then((msg) => {   // CallBack - SuccessFn 
       console.log('Promise Fulfilled..!  / SendingMessage : ', msg); 
   }) 
   .catch((errMsg) => {   // CallBack - FailFn 
       console.log('Promise Rejected..!  / SendingErrMsg : ', errMsg); 
   }) 
   .finally(() => {
       console.log('Always Execute..'); 
   }); 


// 프로미스객체 1000ms(==1Sec) 이후, Rejected(거부) 상태.
function createPromise3() {

    return new Promise((resolve, reject) => {

        /** pending.. (대기상태) */

        setTimeout(() => {

           reject(new Error('errorObject Foward.. ErrorMsg')); 

        }, 1000);
    });
}


// 프로미스 결과 - Rejected(거부) CallBack Function수행..
// ErrorObject
// { message : "errorObject Foward.. ErrorMsg" }

createPromise2() 
   .then(() => {   // CallBack - SuccessFn 
       console.log('Promise Fulfilled..!'); 
   }) 
   .catch((error) => {   // CallBack - FailFn 
       console.log('Promise Rejected..!  / SendingErrMsg :', error.message); 
   })
----------- Function (재귀: Recursive)

function repeatFn(callbackFn) {


    setTimeout(() => {

        callbackFn();
    }, 1000);
}

// 익명 CallBack Function
repeatFn(() => {
    console.log('After 1Sec.. Execute');
});

repeatFn(() => { 
    repeatFn(() => { 
        repeatFn(() => { 
           console.log('After 3Sec.. Execute'); 
        }); 

    }); 
}); 

----------- Promise (재귀: Recursive)

function repeatPromise() {

    return new Promise((resolve, reject) => {

        setTimeout(() => {

            resolve();
        }, 1000);
    });
}

// 프로미스가 연속적으로 호출된다.
repeatPromise() 
    .then(() => { 
        return repeatPromise(); 
    }) 
    .then(() => repeatPromise()) 
    .then(repeatPromise) 
    .then(() => { 
        console.log('After 4Sec.. Execute'); 
    });