Generator

2017-11-13  本文已影响0人  秦小婕

1.简单知识点

2.next()

补充:for..of,解构赋值,Array.from(),...扩展运算符调用的都是遍历器接口。

3.throw()

throw抛出的错误,由try-catch语句中的catch捕获。throw 分为外部的throw命令和生成器的throw()方法。throw命令抛出的错误只能被函数体外捕获。

一旦 Generator 执行过程中抛出错误,且没有被内部捕获,就不会再执行下去了。如果此后还调用next方法,将返回一个value属性等于undefined、done属性等于true的对象,即 JavaScript 引擎认为这个 Generator 已经运行结束了。

同样函数内部抛出的错误,函数外部可以捕获。函数内部有try-catch语句块,g.throw()先被函数内部的try-catch捕获。当函数内部不存在try-catch语句块时,直接被函数外部的try-catch捕获。捕获到函数内部抛出的错误错误,则g.next().done为true,表示遍历结束,不再执行。

4.return()

 g.return('foo');

调用return()结束遍历器,并返回遍历器的返回值。
注意try-finally语句块。调用return()后,执行finally块中的代码,执行完后返回return()。
总结:return(),next(),throw(),都是对yield表达式的替换。next是值的替换,throw()替换成throw语句,return()替换成return语句

5.关于yield

6.generator中的this

generator不能够和new一起用,所以就不能够将this绑定在生成器
出现的问题是:

  function* g() {
     this.a = 11;
  }

  let obj = g();
  obj.a // undefined

解决方法,创建空对象,使用call绑定generator内部的this对象

  function* F() {
       this.a = 1;
       yield this.b = 2;
       yield this.c = 3;
    }
   var obj = {};
   var f = F.call(obj);

  f.next();  // Object {value: 2, done: false}
  f.next();  // Object {value: 3, done: false}
  f.next();  // Object {value: undefined, done: true}

  obj.a // 1
  obj.b // 2
  obj.c // 3

7.generator函数与状态机

generator中一个yield就是一个状态

*8.generator与协程序

9.generator的应用

异步同步化
利用yield,按顺序执行异步函数
多步骤管理

promise.done:不会反悔promise对象,因此不能够接cache(),形成promise链。异常直接抛出给外部。作用,防止promise中的人为的,难以查找出的错误。

注意:这里generator是同步化的,不存在异步调用。
部署iterator 接口

 function* iterEntries(obj) {
    let keys = Object.keys(obj);
    for (let i=0; i < keys.length; i++) {
    let key = keys[i];
    yield [key, obj[key]];
    }
}

let myObj = { foo: 3, bar: 7 };

for (let [key, value] of iterEntries(myObj)) {
       console.log(key, value);
 }

 // foo 3
 // bar 7

Object.keys()
Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用 for...in循环遍历该对象时返回的顺序一致 (两者的主要区别是 一个 for-in 循环还会枚举其原型链上的属性)
作为数据结构

上一篇 下一篇

猜你喜欢

热点阅读