Generator、yield用法

Generator

1.用于异步编程
2.最大的特点是交出函数耳钉执行权(暂停执行)

写法:funcation关键字与函数名之间有一个 星号

可以结合yield语句,定义不同的内部状态(状态,就是数据。内部的额状态,就是函数内部的值
,它在不同的时候,是不一样的)

本质上,Generator函数就是一个封装的异步的任务。异步容器

  • 需要使用.next()的方法进行启动,作用是分阶段执行Generator函数
  • 每次调用.next()会返回一个对象
  • 表示当前阶段的信息

value属性
done属性
1. true:表示函数已经执行完成
2.false:表示函数还没有执行完成

yield

有时可以当成return,但是与return的本质不一样

范例1:

 function *xxfn(){
    yield 'a';
    yield 'b';
    yield 'c';
    return 'd ,end....';

  }
  var _xxfn = xxfn();
  console.log(_xxfn.next()); // done: false  value: "a"
  console.log(_xxfn.next()); // done: false  value: "b"
  console.log(_xxfn.next()); // done: false  value: "c"
  console.log(_xxfn.next()); // done: true  value: "d ,end...."
  console.log(_xxfn.next()); // done: true  value: "undefined"

在这里插入图片描述

范例2:

 function *test(){
    let a =1;
    yield ++a;
    yield ++a;
    yield ++a;
    yield ++a;
  }
  let aa=test()
  let bb=test()

  console.log(aa.next());
  console.log(aa.next());
  console.log(bb.next());
  console.log(aa.next());

在这里插入图片描述

aa和bb是两个迭代器,不会互相影响

每个迭代器之间是相互独立的,作用域独立

每当你调用了一个迭代器内部的.next()方法,Generator函数内部的指针,
就是从上一次停下的地方,
继续运行,直到遇到下一个yield语句。
最后,为什么说是迭代器对象呢,
因为它得把里面的yield语句都走一遍。

  • yield,就像录音机上的暂停键;
  • next,就像录音机上的继续键。

Generator函数中的.next()方法可以接收参数
-传入的参数,其实是把上一个yield语句的返回的值给覆盖了;
-第一个.next()方法其实是启动器,
在它之前没有yield语句,
所以给第一个.next()方法去传参是没意义的。

范例:

function* xxfn(){
  var _n = 1;
  var _v = yield _n +22;
  console.log( 'aa---:' +_v);yield ++_n;
  yield ++_n;
  yield ++_n;
}

var _xxfn = xxfn();
console.log(_xxfn.next());
_xxfn.next('abc')
console.log(_xxfn.next());

在这里插入图片描述

解析结果:
1.第一个.next
第一个.next,它返回的value是23,1+22
var _v = yield _n +22;这是一个赋值运算

2.第二个next
传入的参数,其实是把上一个yield语句的返回的值给覆盖了
上一个yield语句的值是,yield = _n +22;
然后你传入了’abc’,
那么上一个yield语句的值,就变成了,yield = ‘abc’;
然后又赋值给了_v,
所以就打印了console.log( ‘aa—:’ +_v),是aa—:abc,
然后遇到了下一个yield就又停了

3.第三个next
传入的参数,其实是把上一个yield语句的返回的值给覆盖了
但是,它并没有修改之前声明的变量_n的值;
_n的值,依然是1,然后二次++_n,
加完是3

Generator函数,支持for of循环,
用来迭代Generator函数在执行时,
生成的那个迭代对象,

范例:

  function *xxfn(){
    yield 'a';
    yield 'b';
    yield 'c';
    return 'd ,end....';

  }
  var _xxfn = xxfn();
  for(let i of _xxfn){
    console.log(i);
  }

打印结果:

a
b
c
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值