生成器实现异步
js中实现异步有三大方式: 回调
Promise
generator
回调
- 优势:简单、语义清晰
- 劣势:回调地狱
Promise
- 优势: 链式调用解决回调地狱、Promise.all 可以处理多个异步
- 劣势:需要适用Promise语法
Generator
- 优势:利用yield编写可读性更强、可以恢复和暂停、是async/await的底层原理、
- 劣势:不是专门解决异步的,需要搭配Promise、要手动编写生成器和迭代器使得编码更复杂
现在我们来详细聊聊generator实现异步
场景
我要读一个文件dir.txt 这是一部目录,里面记录了 Lzy.json , XXX.json …. 等等 用户文件。
然后我们要读取Lzy.json 的信息。
用 async/await
方式解决
1 | async function read() { |
用 generator
方式解决
1 | function* read() { |
这样只执行了第一步,而我们得到第一步的PromiseResult之后要继续递归的运行next(PromiseResult) 这样才能得到第二步。
所以我们需要一个执行器
co
,
1 | let finalRes= co(read()) |
实现 co
1 | function co(gen) { |
context 就是上一步yield后面的表达式完成时的PromiseResult
例如: const dir = yield readFile('./txt/dir.txt', 'utf8');
就是把context 赋值给了dir