美文网首页
generator yield next

generator yield next

作者: arickxuan | 来源:发表于2017-04-12 14:16 被阅读0次
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');
}

  1. yield* inner():相当于用inner的内容来替换该位置,不会消耗一次next()调用,inner内的代码会被执行
  2. yield* inner:报错。因为inner是一个generator function,而yield*后面应该是一个igenerator
  3. yield inner():yield的结果是一个generator,消耗一次outer的next()调用,且inner内的代码不会被执行
  4. 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的yield next中,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

相关文章

  • python yield和yield from用法总结

    python yield和yield from用法总结 yield 作用: 注: generator的next()...

  • generator yield next

    yield* inner():相当于用inner的内容来替换该位置,不会消耗一次next()调用,inner内的代...

  • generator异步调用原理

    generator是一个状态保存机,每次遇到yield会停止,需要调用next函数来执行 而yield返回的值是无...

  • generator函数和async/await函数

    generator函数 yield next() 可以控制代码执行的暂停与恢复,但不改变执行顺序 async aw...

  • yield generator

    使用yield,可以让函数生成一个序列,该函数返回的对象类型是"generator",通过该对象连续调用next(...

  • python入门 第十五天 生成器、迭代器

    生成器 generator关键词yield:保存上一次的执行状态,__next__:执行函数寻找下一个yieldd...

  • generator函数

    generator是ES6里面的语法,英文翻译过来就是生成器的意思,还有两个英文yield(放弃),next(下一...

  • 关于es6新属性yield

    关于es6新属性yield yield是Generator函数中中断函数返回的一个属性。Generator函数即一...

  • Python yield的使用

    带有 yield 的函数在 Python 中被称之为 generator(生成器),何谓 generator ? ...

  • async await 的实现原理

    generator + yield + promise 利用generator遍历器生成器函数的分段执行 ,只有在...

网友评论

      本文标题:generator yield next

      本文链接:https://www.haomeiwen.com/subject/podmattx.html