作者:浪人-zhao_433 | 来源:互联网 | 2023-06-05 11:20
0.背景今天要讨论的Generators,在上一篇中提到过,这一篇稍微谈谈。1.概览生成器的写法varfibonacci{[Symbol.iterator]:function*()
0.背景
今天要讨论的Generators,在上一篇中提到过,这一篇稍微谈谈。
1.概览
生成器的写法
var fibOnacci= { [Symbol.iterator]: function*() { var pre = 0, cur = 1; for (;;) { var temp = pre; pre = cur; cur += temp; yield cur; } } } for (var n of fibonacci) { // truncate the sequence at 1000 if (n > 1000) break; console.log(n); }
2.展开聊聊
2.1.Generator.prototype.next() next()
方法返回一个包含属性 done
和 value
的对象。该方法也可以通过接受一个参数用以向生成器传值。
举个例子:
function* gen() { yield 1; yield 2; yield 3; } var g = gen(); // "Generator { }" g.next(); // "Object { value: 1, done: false }" g.next(); // "Object { value: 2, done: false }" g.next(); // "Object { value: 3, done: false }" g.next(); // "Object { value: undefined, done: true }"
一般情况下,next 方法不传入参数的时候,yield 表达式的返回值是 undefined 。当 next 传入参数的时候,该参数会作为上一步yield的返回值。
function* sendParameter(){ console.log("start"); var x = yield '2'; console.log("one:" + x); var y = yield '3'; console.log("two:" + y); console.log("total:" + (x + y)); } var sendp1 = sendParameter(); sendp1.next(); // start // {value: "2", done: false} sendp1.next(); // one:undefined // {value: "3", done: false} sendp1.next(); // two:undefined // total:NaN // {value: undefined, done: true} // ----------------------------------------------------next传参 var sendp2 = sendParameter(); sendp2.next(10); // start // {value: "2", done: false} sendp2.next(20); // one:20 // {value: "3", done: false} sendp2.next(30); // two:30 // total:50 // {value: undefined, done: true}
2.2.Generator.prototype.return() return()
方法返回给定的值并结束生成器。
function* gen() { yield 1; yield 2; yield 3; } var g = gen(); g.next(); // { value: 1, done: false } g.return("foo"); // { value: "foo", done: true } g.next(); // { value: undefined, done: true }
2.3.Generator.prototype.throw() throw() 方法用来向生成器抛出异常,并恢复生成器的执行,返回带有 done 及 value 两个属性的对象。
function* gen() { while(true) { try { yield 42; } catch(e) { console.log("Error caught!"); } } } var g = gen(); g.next(); // { value: 42, done: false } g.throw(new Error("Something went wrong")); // "Error caught!"
3.结语
生成器这部分,个人还是觉得多看多听多学,遇到确实好的实践再用,瞎用只会增加阅读代码的负担。