Web 技术研究所

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

ES6的奇葩特性之一 Generators

  从NodeJS的0.11.2版本开始就支持Generators了。它的引入可以给异步封装带来很大程度的便利。它添加了yield,以类似于中断函数执行的形式让函数临时返回数据,之后调用next方法来继续运行函数。但我并不喜欢这套特性,总觉得它的设计很不科学而且有点鸡肋。
  下面是一个最简单的使用示例 function* A(){
  console.log("start");
  console.log("yield:",yield "我是y1"); //我是n2
  return "end";
};
var a=new A; //函数并不执行
console.log(a.next()); //执行到yield停止,返回{value:"我是y1",done:false}
console.log(a.next("我是n2"));

  第一次看到也许会觉得这个运行结果很奇怪(实际上这个运行结果就是很奇怪啊!!),习惯之后可能会感觉没那么恶心。Generators是一种特殊的函数,它的定义和普通函数的差别是在function关键字后面会出现个星号。这种函数被直接调用时不会执行其中的代码,但可以得到一个接口对象。这个对象的next方法被调用时函数才开始执行代码。当执行遇到yield运算符时,函数的执行会停止。next方法的返回值就是停止函数执行的那个yield运算符的操作数。如果要让程序继续运行就需要再次调用接口对象的next方法,而这个next方法也是可以带参数的,它的参数会作为之前暂停函数执行的那个yield运算符的操作结果。
  这个逻辑大概就是这样,是不是觉得很鸡肋呢?它的功能用Promise也可以实现,而且实现的逻辑会比它还清晰。我觉得这个Generators特性整个设计都很不科学。首先是它的语法设计,在function后面加个星号?一眼看过去这是C++的函数指针还是什么?我完全无法理解这个星号的含义,不过它确实让函数有了一些特性,比如有自己独特的prototype,并且在调用时不会执行代码。然后就是调用时返回的操作对象问题。这个对象分明就是函数的实例,执行instanceof运算可以得到true,而且构造器中的this也可以调用next方法。而且在重定义函数的prototype之后这个实例的next方法会被弄丢,这又是一个很坑爹的地方。最后是yield运算符的问题。它就好像一个能挂起函数执行的运算符,这不是很奇怪吗?一个小小的运算符凭什么可以挂起函数?这么一折腾感觉整个程序顺序执行的基本逻辑都被打乱了。
  总之,我就觉得Generators完全就是个蛋疼的东西。也许是它太新颖了吧,反正我暂时接受不了这样违背传统编程思想的东西。
网名:
3.80.32.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^