复习
generator是一种ES6的新函数类型,它不像普通函数那样运行至完成。相反,generator可以暂停在一种中间完成状态(完整地保留它的状态),而且它可以从暂停的地方重新开始。
这种暂停/继续的互换是一种协作而非抢占,这意味着generator拥有的唯一能力是使用yield
关键字暂停它自己,而且控制这个generator的 迭代器 拥有的唯一能力是继续这个generator(通过next(..)
)。
yield
/next(..)
的对偶不仅是一种控制机制,它实际上是一种双向消息传递机制。一个yield ..
表达式实质上为了等待一个值而暂停,而下一个next(..)
调用将把值(或隐含的undefined
)传递回这个暂停的yield
表达式。
与异步流程控制关联的generator的主要好处是,在一个generator内部的代码以一种自然的同步/顺序风格表达一个任务的各个步骤的序列。这其中的技巧是我们实质上将潜在的异步处理隐藏在yield
关键字的后面——将异步处理移动到控制generator的 迭代器 代码中。
换句话说,generator为异步代码保留了顺序的,同步的,阻塞的代码模式,这允许我们的大脑更自然地推理代码,解决了基于回调的异步产生的两个关键问题中的一个。