刚才又一次翻了下这个论坛,看到不少asyn/await,generator,promise的问题,感觉到许多朋友太过于把写好JS的希望寄托在这些新语法上(当然Promise不新了),所以写了 https://cnodejs.org/topic/5877b8d72967eeb01aafe6f4 “管理回调的姿势”。
我喜欢纯真乡土的东西。虽然ES6功能正在被快速地引入主流浏览器,哪怕还没有被引入浏览器,也已经被引进了JS开发的工作流,Babel,TypeScript。但是异步编程既然是JS编程的内在需要,为什么愣是要把自然的异步代码拉直了,让它看上去像同步代码?
高大上的东西不少,如generator配合promise再配合co的同步化结构
co(function *(){
// resolve multiple promises in parallel
var a = Promise.resolve(1);
var b = Promise.resolve(2);
var c = Promise.resolve(3);
var res = yield [a, b, c];
console.log(res);
// => [1, 2, 3]
}).catch(onerror);
这些库的作者能举出来的例子当然看上去像阳春三月那样美好,但实际具体的编程场景是否如此呢?我觉得不是,首先要让一个有层次的团队,初中高水平不等的开发都用这些高级的东西,既费劲也无必要,实际天天使用这种结构来设计我们的程序,不觉得概念负担有点大?语法看上去简单了,没有大括号,没有圆括号,没有缩进等等。
但是,概念复杂了,没有必要的概念。
我不是说这种东西没用,做出来有人有当然是有用的,只是觉得这种做出来解决10%的场景下问题的结构,没有必要让我们觉得是灵丹妙药。
哪怕更简单的Promise也是,它自然很有用,但如果一个程序的设计里不分勤红皂白都上Promise,简单回调可解决的API,非得设计成Promise API,设计成这样用起来又发挥不出来Promise的强项,就只是为了概念而概念,开发者就是在为自己和别人制造问题而不是解决问题,是把开发变得复杂而不是简单。
现在有多少实际存在的项目能够无缝地改造成能够接上 ES6 + Babel或者TypeScript开发的?如果是历史项目,特别是体量比较大的,恐怕不多,而且许多项目也没有必要吧。更别说ES7,还有很多人趋之若鹜的Async语法了。
我看到有人说“用Koa,因为Koa可以直接上ES6语法”,天哪,难道这是选择一个框架最重要的理由吗?
高大上的东西都有用,用好了都很好,不过你是Javascript程序员,还是需要知道Javascript的传统吧,知道了传统,哪怕没有高大上的东西,你也能把程序写得漂漂亮亮的,对吧?反过来,依赖特定的语法和结构来编程,核心概念却理解得不通透,能叫自己是Javascript程序员吗?
编程还是为了解决实际开发问题,为别人服务,而不是自己一个人在些技术的犄角旮旯里痛快啊。