什么是Generator函数?

传统的编程语言,早有异步编程的解决方案(其实是多任务的解决方案)。其中有一种叫做“协程”(coroutine),意思是多个线程互相协作,完成异步任务。

协程有点像函数,又有点像线程,它的运行流程大致如下:

  • 第一步,协程 A 开始执行;
  • 第二步,协程 A 执行到一半,进入暂停,执行权转移到协程 B
  • 第三步,(一段时间后)协程 B 交还执行权;
  • 第四步,协程 A 恢复执行;

上面流程的协程 A,就是异步任务,因为它分成两段(或多段)执行。

举例来说,读取文件的协程写法如下:

function* asyncJob() {
 // ...
 var f = yield readFile(fileA);
 // ...
}

上面代码的函数 asyncJob 是一个协程,它的奥妙就在其中的 yield 命令。它表示执行到此处,执行权将交给其他协程。也就是说,yield 命令是异步两个阶段的分界线。协程遇到 yield 命令就暂停,等到执行权返回,再从暂停的地方继续往后执行

Generator 函数是协程在 ES6 的实现,最大特点就是可以交出函数的执行权(即暂停执行)。

function* gen(x) {
  var y = yield x + 2;
  return y;
}

var g = gen(1);
g.next() // { value: 3, done: false }
g.next(2) // { value: 2, done: false }

next 是返回值的 value 属性,是 Generator 函数向外输出数据;next 方法还可以接受参数,向 Generator 函数体内输入数据。

上面代码中,第一个 next 方法的 value 属性,返回表达式 x + 2 的值 3。第二个 next 方法带有参数 2,这个参数可以传入 Generator 函数,作为 上个阶段 异步任务的返回结果,被函数体内的变量 y 接收。因此,这一步的 value 属性,返回的就是 2(变量 y 的值)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Generator函数是一种特殊的函数,它是一个状态机,可以暂停执行并在需要时恢复执行。Generator函数的定义使用function关键字和一个星号(*),内部使用yield表达式来定义不同的内部状态。调用Generator函数后,函数并不会立即执行,而是返回一个指向内部状态的指针对象。通过调用这个指针对象的next()方法,可以逐步执行Generator函数内部的代码,并返回每个阶段的值和是否执行完毕的状态。 在Generator函数内部,可以使用yield*表达式来执行另一个Generator函数。yield*表达式可以将执行权交给另一个Generator函数,并在其执行完毕后再返回执行权给当前Generator函数Generator函数的数据交换可以通过调用next()方法传入参数来实现。在Generator函数内部,可以使用yield表达式来接收传入的参数,并返回相应的值。每次调用next()方法时,传入的参数会作为上一个阶段异步任务的返回结果,被函数体内的变量接收。 总结来说,Generator函数是一种特殊的函数,可以暂停执行并在需要时恢复执行。它通过yield表达式来定义不同的内部状态,并通过next()方法来逐步执行和控制函数的执行流程。yield*表达式可以在一个Generator函数内部执行另一个Generator函数。数据交换可以通过调用next()方法并传入参数来实现。 #### 引用[.reference_title] - *1* *3* [es6中的generator函数详解](https://blog.csdn.net/weixin_43638968/article/details/105475881)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Generator函数](https://blog.csdn.net/qq_43239667/article/details/123984997)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ahaott

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值