<<深入浅出nodeJS>>读书笔记--<二>
第三章 异步I/O
目的:
1、响应速度快,用户体验佳
同步: getData(‘from_db‘); // 消耗时间M getData(‘from_db2‘); //消耗时间N //总时间为M + N 异步: getData(‘from_db‘,function(res){ // 消耗时间为 M }); getData(‘from_db2‘,function(res){ // 消耗时间为 N }); // 总时间为 Max(M,N);
2、单线程,资源分配合理
优缺点:
优点:高并发,非阻塞高性能处理
缺点:业务逻辑顺序混乱(后面有异步解决方案)
异步I/O与非阻塞
实现现状:轮询技术,五种(read,select,poll,epoll,kqueue)
Node的异步I/O:
-事件循环
-观察者
-请求对象
-执行回调
非I/O的异步回调API:
1、定时器 setTimeout
2、process.nextTick()
3、setImediate()
setImediate 与 process.nextTick()的异同点:
相同点: 用法 和 功能几乎都一样
不同点: 1、process.nextTick()的优先级要高些,原因是 事件循环对观察者的检查是有先后顺序的。
2、具体实现上,process.nextTick()的回调函数保存在一个数组中,setImmediate()的结果是保存在链表中的。
3、在行为上,process.nextTick()在每轮循环中会将数组中的回调函数全部执行完,而setImmediate()在每轮循环中执行链表的第一个回调函数.
示例代码佐证:
process.nextTick(function(){ console.log(‘process.next延迟执行1‘); }); process.nextTick(function(){ console.log(‘process.next延迟执行2‘); }); setImmediate(function(){ console.log(‘setImmediate延迟执行1‘); process.nextTick(function(){ console.log(‘process.next强势插入‘); }); }); setImmediate(function(){ console.log(‘setImmediate延迟执行2‘); }); console.log(‘正常执行‘);
//结果为:
正常执行
process.next延迟执行1
process.next延迟执行2
setImmediate延迟执行1
process.next强势插入
setImmediate延迟执行2
Node构建Web服务器大致流程 : 网络请求-->事件循环-- > 执行回调
Node专属服务器:Nginx, 大有取代Apache之势
第四章 异步编程
在Javascript里函数是"一等公民",在Node中,异步编程无处不在,而在异步编程中,回调函数是必不可少得.这里对函数式编程稍作补充,因为它是异步编程的基础。
(1)高阶函数
特点:
- 函数作为参数传递
- 函数作为返回值
//作为参数或者返回值 function fn1(x){ return function(){ return x } }
(2)偏函数
特点:
- 调用两次
- 第二次调用传入新的参数
- 新参数以闭包形式存在
function isType(type){ return function(obj){ // obj为第二次传参时的参数 return toString.call(obj) == ‘[object‘+ type ‘]‘; } } var isString = isType(‘String‘); console.log(isString(xx)); // 第二次传参检测XX是否为String类型
异步编程的优势与难点:
优势:非阻塞I/O,高性能
难点:
1、异常处理
2、嵌套过深
3、代码阻塞
4、多线程编程
5、异步转同步
异步编程解决方案:
1、事件发布/订阅模式
2、Promise/A
3、流程控制库
1、事件发布/订阅模式:(on/emit 实现)
- 继承event模块,event.EventEmitter
- 事件队列解决雪崩问题
目的:过滤掉重复的事件,利用once()实现
- 多异步之间协作方案
哨兵变量:检测次数
单异步 on -> 多异步 all()
(1)多异步处理all();
(2) 一个接口多次读取数据 after()
- EventProxy的原理
- EventProxy的异常处理
额外添加啊error事件处理,fail()、done()
2、Promise/Deferred模式
-Promise/A
(1)三种状态:未完成、完成、失败
(2) 具备then()方法,接收完成、失败态的错误回调,可选地支持progress事件回调作为第三个方法,返回Promise对象,实现链式调用
(3) 触发执行回调的地方 Deferred对象
-Node中的Promise
(1) q模块
(2)when模块
-pomise中的多异步协作
deferred.all([p1],[p2]).then(function(p1Data,p2Data){})
-promise进阶
(1)事件封装的promise出现弊端,陷入"回调地狱"
(2)完美封装Promise,并API化
3、流程控制库
1、尾触发与next(适用处理网络请求的场景)
2、中间件
(一)async流程控制库
(1) 异步的串行执行
async.series()
(2)异步的并行执行(多异步协作)
async.parallel()
(3)异步调用依赖
async.waterfall()
(4)自动依赖
(二)其它库
1、stepJs
2、windJs,国人研发,前身是jscex
小结:
事件发布/订阅为最原始的方式
promise注重封装异步调用
流程库注重回调函数的注入
异步并发控制:
1、bagpipe解决方案
2、async解决方法
-限制并发数量,使得任务只能同时并发一定数量,而不是无限制并发
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。