Generator函数-协程

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

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

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

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

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

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

上面代码的函数 asyncJob 是一个协程,它的奥妙在于其中的 yield 命令。它表示执行到此处时,执行权将交给其他协程。也就是说,yield 命令是异步两个阶段的分界线。

协程遇到 yield 命令就暂停,等到执行权返回,再从暂停的地方继续往后执行。它的最大优点是,代码的写法非常像同步操作,如果去除 yield 命令,几乎一模一样。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 JavaScript 中,协程函数通常使用生成器函数generator function)来实现。生成器函数是一种特殊的函数,可以通过 yield 关键字来暂停和恢复函数的执行,从而实现协程的效果。 一个简单的协程函数的例子如下: ```javascript function* myCoroutine() { console.log('Started'); yield; console.log('Resumed'); } const gen = myCoroutine(); gen.next(); // 输出:Started gen.next(); // 输出:Resumed ``` 在上面的例子中,myCoroutine 函数定义为生成器函数,使用 yield 关键字暂停函数的执行。在第一次调用 gen.next() 方法时,函数开始执行,输出 "Started",然后执行到 yield 关键字处暂停。在第二次调用 gen.next() 方法时,函数从暂停的位置继续执行,输出 "Resumed"。 协程函数可以帮助我们更方便地管理异步操作,避免回调函数嵌套的问题。例如,我们可以使用协程函数来实现一个简单的异步任务队列: ```javascript function* taskQueue() { while (true) { const task = yield; console.log('Starting task:', task); yield new Promise(resolve => setTimeout(resolve, 1000)); console.log('Task completed:', task); } } const queue = taskQueue(); queue.next(); queue.next('Task 1'); queue.next('Task 2'); ``` 在上面的例子中,taskQueue 函数定义了一个无限循环,每次循环会等待外部传入的任务,并在任务开始和结束时输出一些信息。我们可以通过调用 queue.next() 方法来启动任务队列,然后通过调用 queue.next(task) 方法来添加新的任务。在添加任务后,协程函数会暂停执行,等待异步操作完成后再继续执行。这样,我们就可以方便地管理多个异步任务,避免了回调函数嵌套的问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值