传统的编程语言中早有异步编程的解决方案(其实是多任务的解决方案),其中一种叫做”协程“(coroutine),意思是多个线程互相协作,完成异步任务。
协程有点像函数,也有点像线程。它的运行流程大致如下:
- 第一步,协程A开始执行。
- 第二步,协程A执行到一半,进入暂停状态,执行权转移到协程B中。
- 第三步,(一段时间后)协程B交还执行权。
- 第四步,协程A恢复执行。
上面流程的协程A就是异步任务,因为它分成两段(或多段)执行。
举例来说,读取文件的协程写法如下:
function *asyncJob() {
// ...其他代码
var f = yield readFile(fileA);
// ...其他代码
}
上面代码的函数 asyncJob 是一个协程,它的奥妙在于其中的 yield 命令。它表示执行到此处时,执行权将交给其他协程。也就是说,yield 命令是异步两个阶段的分界线。
协程遇到 yield 命令就暂停,等到执行权返回,再从暂停的地方继续往后执行。它的最大优点是,代码的写法非常像同步操作,如果去除 yield 命令,几乎一模一样。