<<深入浅出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解决方法

-限制并发数量,使得任务只能同时并发一定数量,而不是无限制并发

 

 

 

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。