这一章的知识跨度看起来不广,但是知识深度的还是挺深的,异步编程作为nodejs的核心,个人同时需要一定的深度才可以去理解。
在这一章提到了函数式编程和异步编程解决方案的两个知识点,首先来了解一下函数式编程
函数式编程
这里先放一本书,https://www.gitbook.com/book/llh911001/mostly-adequate-guide-chinese/details 觉得讲得不错,因为越到后面越看不懂
JavaScript其实之前是一直被误解的,因为它一直被当做是命令式式的编程语言,或许js爸爸Brendan Eich一开始设计的时候也是这样想的,但是其实js也是可以做函数式的编程。所谓函数式编程,其实不难,不同于后台强类型语言的面向对象式的编程语言,函数式编程是种编程范式,它将电脑运算视为函数的计算,强调计算。
函数式编程有以下特点:支持闭包和高阶函数,支持惰性计算(lazy evaluation)。使用递归作为控制流程的机制。加强了引用透明性。没有副作用。(这句话是百度的)
这本书主要介绍了函数式编程的一些规范,我只拿其中的简单几个概念作为例子
高阶函数: 高阶函数是可以把函数作为参数(如传递一个方法作为参数),或者说是可以把函数作为返回值的函数(其实就是return一个函数)
偏函数: 偏函数是指通过部分参数来产生一个新的定制的函数的方式,这种就叫做偏函数
纯函数: 书中的定义是这样的,纯函数是这样一种函数,即相同的输入,永远会得到相同的输出,而且没有任何可观察的副作用。其实最重要的就是这句话,相同的输入总会的得到相同的输出,纯函数的纯就在这一点,不过多的对函数之外的环境产生依赖,保证函数本身的纯粹,从而达到纯的目的
函数柯里化:curry无法口述,用一个例子来解释
var add = function(x) {
return function(y) {
return x + y;
};
};
var increment = add(1);
var addTen = add(10);
increment(2);
// 3
addTen(2);
这里我们定义了一个 add 函数,它接受一个参数并返回一个新的函数。调用add 之后,返回的函数就通过闭包的方式记住了 add 的第一个参数。一次性地调用它实在是有点繁琐,好在我们可以使用一个特殊的 curry 帮助函数(helperfunction)使这类函数的定义和调用更加容易。
异步编程
异步编程的优势和难点
node的异步编程所带来的最大优势就是基于事件驱动的非阻塞IO模型。非阻塞IO可以是CPU和IO操作并不相互依赖等待,让资源得以更好地利用。对于一些网络应用而言,并行还可以带来的优势是分布式和云。
但同时,node所带来的难点还是很困难的:
难点1: 异常处理 异步中的异常都是这个尿性,看下jquery的ajax就知道,所以在编写异步方法时,需要将异常正确的返回给用户的回调方法
难点2: 函数嵌套过深 回调地狱,不解释,但是现在有Promise,接下来会说
难点3: 阻塞代码 单线程的缺点,谨慎处理
难点4: 多线程编程 还是单线程所带来的问题,不过node有自己child_process
难点5: 异步转同步
这个就是node用惯了异步,但是没有同步操作的API,所以可能在实现同步的时候要去借助第三方库,不过放心,npm上面的插件肯定很多
异步编程的解决方案
关于异步编程的解决方案,书中给出了四种,分别是事件发布/订阅模式、Promise/Deferred、流程控制库、异步并发控制
事件发布/订阅模式: 这个就是设计模式中的一个概念,node中的event模块其实是一个很好地实践
Promise/Deferred: 强调事件的状态和目标,根据状态来执行,从而避免深度嵌套,这个es6中的Promise也已经有了很好地实现
流程控制库:流程控制的一个重要的概念就是尾触发,es6对这个有个比较好的实现,那就是终止函数,在es7的草案中,更是直接使用了await作为流程控制中止函数标识
异步并发控制: 考虑到异步操作对内存的影响,为避免cpu挂掉,所以要对异步的并发进行控制
扩展:
既然说到了流程控制,就不得不说现在最流行的两个前端框架,Express和koa
Express是一个老牌的web应用框架了,Express 是一个基于 Node.js 平台的极简、灵活的 web 应用开发框架,它提供一系列强大的特性,帮助你创建各种 Web 和移动设备应用。
具体移步官网看,官网:http://www.expressjs.com.cn/。
koa是新一种的前端框架,koa 是由 Express 原班人马打造的,致力于成为一个更小、更富有表现力、更健壮的 Web 框架。使用 koa 编写 web 应用,通过组合不同的 generator,可以免除重复繁琐的回调函数嵌套,并极大地提升错误处理的效率。koa 不在内核方法中绑定任何中间件,它仅仅提供了一个轻量优雅的函数库,使得编写 Web 应用变得得心应手。koa低层的实现依赖TJ大神的CO,库很小巧,暂时不深入,具体移步官网,官网:http://koa.bootcss.com/
前端新手,弱鸡一枚,如有错误,请指正,谢谢!