Front-Html/Javascript

Generator를 이용한 비동기 처리

seongsland 2022. 1. 20. 11:57

우선 아래 예제를 확인한다.

결과는 기존 Promise 비동기 방식과 동일하다.

https://seongsland.tistory.com/272

 

Promise async await를 이용한 비동기 처리

샘플을 보면 대충 사용하는 방식을 알 수 있다. (색칠한 부분을 유의하면서 보도록 하자) function test1() { return new Promise((resolve, reject) => { setTimeout(() => { resolve('test1 end'); }, 1000);..

seongsland.tistory.com

 

 

function test1() {
    setTimeout(() => {
        tests.next('test1 end');
    }, 1000);
}

function test2() {
    setTimeout(() => {
        tests.next('error');
    }, 1000);
}

function * getTests() {
    try {
        const t1 = yield test1();
        console.log("result : " + t1);

        if(t1 == "test1 end") {
            const t2 = yield test2();
            if(t2 == "error") {
                throw "test2 end";
            }

            console.log("result : " + t2);
        }
    } catch(err) {
        console.error("error : " + err);
    }
}

let tests = getTests();
tests.next();

 

 

  • 비동기를 처리할 함수에 *를 추가하면 Generator 함수로 처리된다.
  • Generator 함수는 .next();로 다음 yield 까지를 진행시킬 수 있다.
  • 마지막줄의 test.next(); 실행시 getTests() 함수의 첫 yield 까지 진행된다.
  • 그 이후 순차 적으로 비동기 방식으로 getTests()의 다음 yield 까지가 진행 되는 방식이다.
  • .next(값) 에 값을 넣어주면 왼쪽의 받는 변수에 대입시킬 수 있다.