generator函数中yield表达式返回值与next参数及其应用

《ECMAScript 6 入门》中提到:

  1. 遇到yield表达式,就暂停执行后面的操作,并将紧跟在yield后面的那个表达式的值,作为返回的对象的value属性值
  2. yield表达式本身没有返回值,或者说总是返回undefined。
  3. next方法可以带一个参数,该参数就会被当作上一个yield表达式的返回值。

这几句话意思呢?看如下代码:

function * gene(a, b) {
  console.log(a, b);
  var c = yield 'c';
  console.log("c====", c);
  var d = yield "d";
  console.log("d====", d)
  return 6;
}
var g = gene("a", "b");
var e = g.next("e1", "e2");  
var f = g.next("f1", "f2");
console.log("e====", e);
console.log("f====", f);

控制台打印
上面的结果可以看到generator函数的特点:

  1. 第一次的next执行到第一个yield便停止,这个时候c的赋值还没执行,所以next传入的e1, e2字符串并没有起作用。而到第二次next执行的时候,赋值刚刚开始,因此c的值(默认undefined)被此时传入的参数所替换。因此得出:在next有参数的情况下,上一次yield表达式返回值 == next参数;
  2. 上面看到c的值为"f1",而第二次的next调用传了两个参数(“f1"和"f2”),由此可以看出next只能带一个参数,又或者说,next传递的参数中只有第一个有效;
  3. 每次执行next之后,函数会返回一个对象,该对象的value属性值为紧跟在yield后面的那个表达式的值,这里是"c"和"d"。有人可能会误认为这里yield表达式的返回值就是"c"和"d"。但事实并不是这样。yield可以看成是另一种形式的return(但一个函数只能有一个return值),紧跟在yield后面的即函数每一个阶段执行之后的 “返回值”,而非yield表达式的返回值。
应用

一般与promise搭配使用,这里使用了伪代码:
function
var data1 = yield 异步请求
var data2 = yield 异步请求
var data3 = yield 异步请求

这里可以看到,这个函数要按照顺序分别执行异步函数然后拿到返回值。该函数要满足两个条件:1.自带执行器;2. 能够把异步请求的返回值赋值给data123。从上面可以知道,如果是单纯的generator函数是不能满足这两个条件的,因为它必须依靠执行器才能执行。而且,从上面的例子可以看出,data123并不能直接得到yield后面的异步请求的返回值。因此需要借助一些模块(如co)或者es7的async函数。它们可以自动调用next,并将上一个请求的返回值作为参数传进next中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值