ES6Web前端之路精通ES6

ES6特性-Generators

2017-05-27  本文已影响42人  贺贺v5

what

你可以将Generators认为是可以中断进程、恢复进程的代码段,like this:

function* genFunc() {
    // (A)
    console.log('First');
    yield;
    console.log('Second');
}
const genObj = genFunc();

Generators的概念

Generators are defined with function*.

function* foo(x) {
    yield x + 1;

    var y = yield null;
    return x + y;
}

结果:

var gen = foo(5);
gen.next(); // { value: 6, done: false }
gen.next(); // { value: null, done: false }
gen.send(2); // { value: 7, done: true }

把这个方法贴到在线编辑器上运行了一下,打印出来的的y = 2,我就很不解,然后找了找资料,才得知:

<u·var y = yield; or var yield null;使用来接收.next(参数)方法中的参数的,也就是:这个参数传入生成器中,作为上一个阶段异步任务的返回结果,被函数体内的变量y接收。</u>

另外一个例子:

function* foo(x) {
  yield x+1;
  var y  = yield;
  console.log(`y=${y}`);
  return x + y ;
}

var gen = foo(5);
console.log(gen.next());
console.log(gen.next());
console.log(gen.next(4));

结果:

Object {
  "done": false,
  "value": 6
}
Object {
  "done": false,
  "value": undefined
}
"y=4"
Object {
  "done": true,
  "value": 9
}

Notes:

      -- 翻译的不好,直接上原文。

Generators的类型

function* genFunc() { ··· }
 const genObj = genFunc();
 const genFunc = function* () { ··· };
 const genObj = genFunc();
 const obj = {
     * generatorMethod() {
         ···
     }
 };
 const genObj = obj.generatorMethod();
 class MyClass {
     * generatorMethod() {
         ···
     }
 }
 const myInst = new MyClass();
 const genObj = myInst.generatorMethod();

特性

function fetchJson(url) {
    return fetch(url)
    .then(request => request.text())
    .then(text => {
        return JSON.parse(text);
    })
    .catch(error => {
        console.log(`ERROR: ${error.stack}`);
    });
}

上下是等价的

// es6
const fetchJson = co.wrap(function* (url) {
    try {
        let request = yield fetch(url);
        let text = yield request.text();
        return JSON.parse(text);
    }
    catch (error) {
        console.log(`ERROR: ${error.stack}`);
    }
});
// ECMAScript 2017
async function fetchJson(url) {
    try {
        let request = await fetch(url);
        let text = await request.text();
        return JSON.parse(text);
    }
    catch (error) {
        console.log(`ERROR: ${error.stack}`);
    }
}

Generator扮演的角色

yield如何工作

function* genFunc() {
    yield 'a';
    yield 'b';
}

调用结果:

> const genObj = genFunc();
> genObj.next()
{ value: 'a', done: false }

> genObj.next()
{ value: 'b', done: false }

> genObj.next() // done: true => end of sequence
{ value: undefined, done: true }
function* genFunc() {
    ['a', 'b'].forEach(x => yield x); // SyntaxError
}

function* genFunc() {
    for (const x of ['a', 'b']) {
        yield x; // OK
    }
}

参考

写在后面

GitHub上集大家之力搞了一个前端面试题的项目,里面都是大家面试时所遇到的题以及一些学习资料,有兴趣的话可以关注一下。如果你也有兴趣加入我们的话,请在项目中留言。项目同时也可以在gitbook上查看。

InterviewLibrary-GitHub
InterviewLibrary-gitbook

上一篇下一篇

猜你喜欢

热点阅读