Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

同步 yield 的坑

  Generator 的 yield 可以神奇般地保存调用堆栈,在 next 时返回 yield 跳出的地方。所以 Generator 可以用来处理一些异步问题。比如在异步操作之后时候 yield,并在异步操作完成之后调用 next 把结果传回去。可是 yield 和 next 是一一对应的,如果不是异步而是同步就会出问题。
  比如有这样一坨代码(只是演示代码,不要吐槽用法和写法): let fs = require('fs'); let loadData = (callback) => { fs.readFile(__filename, (error, result) => callback(result)); // callback(fs.readFileSync(__filename)); }; let f = function*() { let data; yield loadData((result) => { data = result; i.next(); }); console.log(data); }; let i = f(); i.next();   这个代码直接跑是正常的,因为 loadData 是异步,每个 yield 还是对应到一个 next。可是如果将上面的代码中读文件的部分改成同步的(注释掉的那一行)就会出错。也许有人会说,既然用了回调,干嘛还同步读?其实我们经常会给函数调用加缓存,如果从缓存同步读内容就会遇到这个问题。
TypeError: Generator is already running   因为 yield 和 next 必须一一对应,如果 loadData 是同步的就相当于在一次 yield 前调了两次 next 所以报了这个错。如果使用 co 之类的库会强行把调用全部异步化(因为用了 Promise)所以永远不会出错(但也因此存在性能问题)。
网名:
54.144.24.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^