穷人家的孩子不能随便高大上
发布于 7 年前 作者 flamingtop 4281 次浏览 来自 分享

刚才又一次翻了下这个论坛,看到不少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程序员吗?

编程还是为了解决实际开发问题,为别人服务,而不是自己一个人在些技术的犄角旮旯里痛快啊。

12 回复

更多的时候,使用这些,都是学习吧,正式环境感觉用得不多

source vue-cnode mobile 2.0

你更无法理解上babel那些人了。。。。所有预编译和编译都是工程化的需要的。不然就成了为技术而技术了

为了更好的解决实际开发问题而衍生的技术与标准,现在是10%的使用率,以后说不准了! From Noder

关键是"Javascript的传统"+“也能把程序写得漂漂亮亮” 如何实现 有没有示例代码发上来学习下

相信我,PHP是最好的语言

支持。技术是用来解决问题的,而不是用来追逐装B获得满足感的。选择一种技术,首先应该看他能解决什么问题,带来什么好处,而不是为了用而用。

@yakczh Javascript的“传统”也就是在ES6和ES7都没有成熟之前

用iife配合closure实现模块化

(function(...){
  // 私有
  
  // 开放接口
  return {
    foo: function () {},
	bar: function () {}
  };
}(dependency ...));

ES6有了import export,不过没有预编译可用性还不是很高,当然这只是前端, http://caniuse.com/#feat=es6-module,后台开发选择余地大一点。

类,继承与代码复用

function Klass() {
  this.foo = ....
}

Klass.prototype = ...

function SubClass () {
  this.bar = ...
}

SubClass.prototype = new Klass()

ES6提供了class语法,方便了语法但有点曲解概念,因为原型还是原型。不过Object.create()是可以用的,ES5内有polyfill,概念一致性更好。

Mixin,Composition over inheritance

var foo = new Foo();
var mixin = { ... };
var bar = extend(foo, mixin);

ES6有Object.assign(),ES5也有polyfill可以用。

当然其他还有,传统方法会用,有新语法你也不会觉得有什么。

我从不在node项目里上babel,不想再加一层,node支持的我就用,不支持的就算了,至于es6 module不支持我用commonjs就OK

@mosaic101 传统的方法其实更能帮助程序员理解Javascript的核心概念,现在ES6和7提供的语法糖,更多时候是为了让JS降低语法费解带来的理解问题,是一种绕行的策略,而不是直面的策略,因为直面JS的语法和概念的不好理解,对很多人来说不直观,所以有class,但是prototype仍然是prototype,有async,但是异步还是异步,有好处有坏处吧。

@flamingtop 这话没毛病,赞成

@artisan 我和你一样,node当前的LTS版本不支持的就不用,哈哈,支持的就用。

回到顶部