Generator
Generator是一个状态机函数,拥有异步机制,每次执行遇到yield时候会中断,遇到next()函数才继续会执行;
协程
协程可以理解成“协作的线程”,也是线程的一种;
在单线程执行环境中,可以并行执行多个线程,但是每次只有单个线程在执行,其余的线程处于暂停状态,线程(或函数)之间可以交换执行权;
传统的“子例程”(subroutine)采用堆栈式“后进先出”的执行方式,只有当调用的子函数完全执行完毕,才会结束执行父函数。
协程则是交换执行权,有多个调用栈,以多占用内存为代价,实现多任务的并行。
Generator可以当作协程的不完全实现,称作半协程(semi-coroutine), 因为只有Generator的调用者,才能将程序的执行权还给 Generator 函数。
如果将 Generator 函数当作协程,完全可以将多个需要互相协作的任务写成 Generator 函数,它们之间使用yield表达式交换控制权。
本文参考:https://www.bookstack.cn/read/es6-3rd/spilt.1.docs-generator.md
委托生成器
yield*
是一个语法,用于在一个生成器函数中委托另一个生成器或可迭代对象。它可以将一个生成器的执行控制权交给另一个生成器或可迭代对象,并将其所有的值逐一返回给外部调用者。