Generator 函数语法
2019-12-05 09:56:20 0 举报
AI智能生成
ES6 - 思维导图
作者其他创作
大纲/内容
Generator.prototype.throw
1、可在函数体外抛出错误
由Generator函数体内catch错误
2、throw方法被捕获以后,
会附带执行下一条yield表达式
3、旦 Generator 执行过程中抛出错误
且没有被内部捕获,就不会再执行下去了
4、throw方法抛出的错误要被内部捕获,
前提是必须至少执行过一次next方法
由Generator函数体内catch错误
2、throw方法被捕获以后,
会附带执行下一条yield表达式
3、旦 Generator 执行过程中抛出错误
且没有被内部捕获,就不会再执行下去了
4、throw方法抛出的错误要被内部捕获,
前提是必须至少执行过一次next方法
Generator.prototype.return()
return方法,可以返回给定的值,
并且终结遍历 Generator 函数
并且终结遍历 Generator 函数
g.return('foo')
// { value: "foo", done: true }
// { value: "foo", done: true }
try...finally
如果 Generator 函数内部有try...finally代码块,
且正在执行try代码块,那么return方法会导致
立刻进入finally代码块,执行完以后,整个函数才会结束
且正在执行try代码块,那么return方法会导致
立刻进入finally代码块,执行完以后,整个函数才会结束
yield* 表达式
用来在一个 Generator 函数里面
执行另一个 Generator 函数
执行另一个 Generator 函数
另一个Generator中如果有返回return
则会返回值给父Generator
则会返回值给父Generator
1、yield* ["a", "b", "c"];
2、function* inner() {
yield 'hello!';
}
function* outer1() {
yield 'open';
yield* inner();
yield 'close';
}
2、function* inner() {
yield 'hello!';
}
function* outer1() {
yield 'open';
yield* inner();
yield 'close';
}
Generator 函数的this
generator 函数也不能跟new命令一起用
generator 函数返回的不是this对象,而是
遍历器对象
generator 函数返回的不是this对象,而是
遍历器对象
完善版既能new也能next:
function* gen() {
this.a = 1;
yield this.b = 2;
yield this.c = 3;
}
function F() {
return gen.call(gen.prototype);
}
var f = new F();
f.next(); // Object {value: 2, done: false}
f.next(); // Object {value: 3, done: false}
f.next(); // Object {value: undefined, done: true}
f.a // 1
f.b // 2
f.c // 3
function* gen() {
this.a = 1;
yield this.b = 2;
yield this.c = 3;
}
function F() {
return gen.call(gen.prototype);
}
var f = new F();
f.next(); // Object {value: 2, done: false}
f.next(); // Object {value: 3, done: false}
f.next(); // Object {value: undefined, done: true}
f.a // 1
f.b // 2
f.c // 3
概述
特征
1、function关键字与函数名之间有一个星号
2、函数体内部使用yield表达式
2、函数体内部使用yield表达式
yield表达式
只有调用next方法才会遍历下一个内部状态
yield表达式就是暂停标志
yield表达式就是暂停标志
1、yield表达式只能用在 Generator 函数里面
2、yield表达式如果用在另一个表达式之中,
必须放在圆括号里面
3、yield表达式用作函数参数或放在赋值表达式的右边,
可以不加括号
2、yield表达式如果用在另一个表达式之中,
必须放在圆括号里面
3、yield表达式用作函数参数或放在赋值表达式的右边,
可以不加括号
与 Iterator 接口的关系
由于 Generator 函数就是遍历器生成函数,
因此可以把 Generator 赋值给对象的Symbol.iterator属性,
从而使得该对象具有 Iterator 接口。
因此可以把 Generator 赋值给对象的Symbol.iterator属性,
从而使得该对象具有 Iterator 接口。
next 方法
next方法可以带一个参数,
该参数就会被当作上一个yield表达式的返回值
该参数就会被当作上一个yield表达式的返回值
总结:
实际上调用next方法,是计算yield后面表达式的值,
再调next,才执行上一个yield所在语句,因此参数
的值可以给到上一个语句使用
实际上调用next方法,是计算yield后面表达式的值,
再调next,才执行上一个yield所在语句,因此参数
的值可以给到上一个语句使用
实现斐波那契数列
function* fibonacci() {
let [prev, curr] = [0, 1];
for (;;) {
yield curr;
[prev, curr] = [curr, prev + curr];
}
}
for (let n of fibonacci()) {
if (n > 1000) break;
console.log(n);
}
let [prev, curr] = [0, 1];
for (;;) {
yield curr;
[prev, curr] = [curr, prev + curr];
}
}
for (let n of fibonacci()) {
if (n > 1000) break;
console.log(n);
}
控制流程管理
实现多任务多步骤
实现多任务多步骤
// 实现多步骤
let steps = [step1Func, step2Func, step3Func];
function* iterateSteps(steps){
for (var i=0; i< steps.length; i++){
var step = steps[i];
yield step();
}
}
let steps = [step1Func, step2Func, step3Func];
function* iterateSteps(steps){
for (var i=0; i< steps.length; i++){
var step = steps[i];
yield step();
}
}
// 实现多任务多步骤
let jobs = [job1, job2, job3];
function* iterateJobs(jobs){
for (var i=0; i< jobs.length; i++){
var job = jobs[i];
yield* iterateSteps(job.steps);
}
}
let jobs = [job1, job2, job3];
function* iterateJobs(jobs){
for (var i=0; i< jobs.length; i++){
var job = jobs[i];
yield* iterateSteps(job.steps);
}
}
// 循环所有任务和步骤
for (var step of iterateJobs(jobs)){
console.log(step.id);
}
for (var step of iterateJobs(jobs)){
console.log(step.id);
}
0 条评论
下一页
为你推荐
查看更多