generator yield next

2324 단어
function* outer() {
    console.log('outer: pre yield');
    // 1. yield* inner();
    // 2. yield* inner;
    // 3. yield inner();
    // 4. yield inner;
    console.log('outer: after yield');
}

function* inner() {
    console.log('inner');
}

  • yield* inner (): 이 위치를 inner의 내용으로 바꾸는 것과 같습니다. next () 호출을 한 번 소모하지 않고 inner 내의 코드가 실행됩니다
  • yield*inner: 오류 보고.inner는generator function이고,yield*뒤에 igenerator가 있어야 합니다
  • yield inner (): yield의 결과는generator로 outer의next () 호출을 한 번 소모하고 inner 내의 코드가 실행되지 않습니다
  • yield inner: yield의 결과는generator function입니다. outer의next () 호출을 한 번 소모하고 inner 내의 코드가 실행되지 않습니다
  • function* f1() {
        console.log('f1: pre next');
        yield* f2();
        console.log('f1: post next');
    }
    
    function* f2() {
        console.log('  f2: pre next');
        yield* f3();
        console.log('  f2: post next');
    }
    
    function* f3() {
        console.log('    f3: pre next');
        console.log('    f3: post next');
    }
    
    var g = f1();
    g.next();
    

    출력:
    f1: pre next f2: pre next f3: pre next f3: post next f2: post next f1: post next

    co.wrap(compose(this.middleware))

    module.exports = compose;
    
    function compose(middleware) {
        return function*(next) {
            var i = middleware.length;
            var prev = next || noop();
            var curr;
    
            while (i--) {
                curr = middleware[i];
                prev = curr.call(this, prev);
            }
    
            yield* prev;
        }
    }
    
    function* noop() {}
    
    

    원본 코드는 비교적 간단하지만 사실은compose([f1, f2,..., fn])가 fn(...f2(f1(noop())으로 바뀌고 최종 반환값은generator function이다.또한 koa의yieldnext에서next는generator임을 알 수 있다.
    다음은 compose로 위의 예를 개작합니다.
    function* f1(next) {
        console.log('f1: pre next');
        yield next;
        console.log('f1: post next');
    }
    
    function* f2(next) {
        console.log('  f2: pre next');
        yield next;
        console.log('  f2: post next');
    }
    
    function* f3(next) {
        console.log('    f3: pre next');
        yield next;
        console.log('    f3: post next');
    }
    
    var compose = require('koa-compose');
    
    var g = compose([f1, f2, f3])();
    g.next();
    g.next();
    
    

    출력:
    f1: pre next f1: post next

    좋은 웹페이지 즐겨찾기