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中。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Generator函数ES6的一种特殊函数,可以被暂停和恢复执行,可以生成一个迭代器对象。Generator函数使用function*关键字声明,内部使用yield语句来暂停函数执行并返回一个值,同时可以使用next()方法恢复函数执行并传入一个值作为上一个yield表达式返回值。 下面是一个简单的Generator函数示例: ```javascript function* myGenerator() { yield 'apple'; yield 'banana'; yield 'orange'; } const iterator = myGenerator(); console.log(iterator.next().value); // 输出:'apple' console.log(iterator.next().value); // 输出:'banana' console.log(iterator.next().value); // 输出:'orange' console.log(iterator.next().value); // 输出:undefined ``` 在上面的示例,myGenerator函数使用yield语句来暂停函数执行并返回一个值。当调用next()方法时,函数会从上一个yield语句处恢复执行,并将传入的值作为上一个yield表达式返回值。当函数执行到最后一个yield语句时,再调用next()方法会返回一个value属性为undefined的对象,表示生成器已经结束。 Generator函数可以用于异步编程,可以使用yield语句暂停异步操作的执行,等待异步操作完成后再恢复执行。下面是一个简单的异步操作的Generator函数示例: ```javascript function* myAsyncGenerator() { const response = yield fetch('https://jsonplaceholder.typicode.com/todos/1'); const json = yield response.json(); console.log(json); } const iterator = myAsyncGenerator(); const promise = iterator.next().value; promise.then(response => iterator.next(response).value) .then(json => iterator.next(json)); ``` 在上面的示例,myAsyncGenerator函数首先使用yield语句暂停函数执行并返回一个promise对象,等待异步操作完成后再恢复执行。在调用next()方法时,我们可以通过Promise的then()方法获取异步操作的结果并传入next()方法,从而实现异步操作的暂停和恢复执行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值