ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JS기본(promise)
    JS 2022. 1. 31. 23:48

    JS는 한 번에 하나의 테스크만 실행할 수 있는 싱글 스레드 방식으로 동작!

    따라서 비동기 작업을 하기 위해 promise 객체를 생성해서 작업해준다.

     

    ●콜백 함수

    1.가독성이 나쁘고 2.비동기 처리 중 발생한 에러의 처리가 곤란 3.여러 개의 비동기 처리를 한번에 처리하는 데도 한계O

     

    ○promise

    1.단점 보완 2.비동기 처리 시점을 명확하게 표현 가능

     

    Promise

     

    promise는 프로미스를 생성하고 종료될 때까지 3가지 상태(states)(프로미스의 처리 과정)를 가진다.

     

    대기(pending), 이행(fulfilled), 실패(rejected) 

    const promise = new Promise((resolve, reject) => {
    	~
    });

    다음과 같이 new Promise로 promise 객체를 생성한다!

    new Promise() 메서드를 호출할 때 콜백 함수를 선언할 수 있고, 콜백 함수의 인자는 resolve, reject이다.

     

    resolve 는 성공, reject는 실패일 경우에 실행되는 함수이다. 

    promise는 state와 result 두개의 property를 가지고

    처음에는 state: pending으로 대기 상태에 있다가

     

    1)resolve

            ↓

    state: fulfilled

    result: value

     

    2)reject

            ↓

    state: rejected

    result: error

     

     

    promise가 끝나고 난 다음의 동작 설정하기

    : then, catch 메소드

     

    const promiseOne = new Promise((resolve, reject) => {
    	resolve();
    });
    promise1
        .then(() => {
        	console.log("then!");
        })
        .catch(() => {
        	console.log("catch!!);
    	});			
        
        //then!

     

    promiseOne에서 resolve가 호출되었기 때문에 then만 실행된다.

    promise.then(
    	function(result) {
        	console.log(result + 'Ok');
    	},
        function(err) {
        	console.log('Nope.');
        }
    );

    이걸 아래와 같이 catch를 사용해서 코드작성해도 된다.

    promise.then(
    	function(result){
        	console.log('ok');
        }
    ).catch(
        function(err){
        	console.log('nope');
        }
    ).finally(
    	function(){
        	console.log('finish!')
        }
    )

    finally의 경우 resolve,reject 둘 중 하나가 실행되면 실행되는 함수!

     

    재사용

    비슷한 비동기 작업을 할 때는 이미 생성한 new Promise(...)를 그대로 리턴하는 함수를 만들어 사용하기.

    function testCode(number) {
    	return new Promise((resolve, reject) => {
        	if (number > 5) resolve();
            else reject();
        });
    }
    
    setTimeout(() => {
    	const promiseOne = testCode(2);
        promiseOne
        	.then(() => {
        		console.log('WOW!  1 then!');
        	})
        	.catch(() => {
        		console.log("OOPS 1");
        	});
        const promiseTwo = testCode(15);
        promiseTwo
        	.then(() => {
            	console.log('OKOK 2 then');
            })
            .catch(() => {
            	console.log('nope, catch 2');
            });
        }, 1000);
        
    // OOPS 1
    // OKOK 2 then

     

    다음과 같이

     

    1. new Promise 로 Promise 객체가 있는 testCode 함수를 생성하고

    2. Promise 객체를 리턴하는 함수 promiseOne, promiseTwo 만들고

    3. number 인자를 받아서 그 값에 따라 resolve, reject를 호출하여 

     

    재사용 할 수 있다. 

     

    'JS' 카테고리의 다른 글

    JS(Async, Await)  (0) 2022.03.23
    JS9(동기/비동기)  (0) 2022.03.17
    JS숫자추측게임1  (0) 2022.01.14
    JS (web API's, event)  (0) 2022.01.14
    JS(this배우기)  (0) 2022.01.13
Designed by Tistory.