异步—一.简介

1.简介


异步编程是指由于异步I/O等因素,无法同步获得执行结果时,在回调函数中进行下一步操作的代码编写风格,常见的如setTimeout函数、ajax请求等等。

示例:

1
2
3
4
5
console.log('hi!');
setTimeout(function(){
console.log('hello!');
},1000);
console.log('wow!');

从示例中可以看到,hello是在wow输出后才输出的,因为setTimeout函数设置了延迟1000毫秒才异步执行,

1
function(){ console.log('hello'); }

就是异步回调函数,这样的编程风格就是异步编程。

2.优势


为什么选择node.js?它有哪些优势呢?

1.性能:相对于多线程,异步I/O没有了线程间的上下文切换开销,由此带来可观的性能提升是选择它的主要原因。

2.成本:由于性能的提升,相同的硬件可以发挥更大的作用,变相的降低了运营成本,由于node.js采用javascript作为开发语言,而javascript的使用已经非常广泛,所以降低了node.js的学习成本。

3.效率:node.js采用javascript作为开发语言,使前后端开发语言统一,不需要切换开发语言,使开发效率更高,加之javascript使用者众多,使得node.js迅速的流行起来。

3.思维习惯


不符合线性思维习惯
虽然异步会带来很多好处,但是也衍生了很多问题。 异步编程在流程控制中业务表达不太适合自然语言的线性思维习惯。

实例 - 获取数据
线性表达

1
var data = getData(id);

异步编程:

1
2
3
getData(id,function(data){
//在回调函数中才能获取到data数据
});

4.异常捕获


异步I/O的实现主要有两个阶段,①提交请求;②处理结果; 这两个阶段彼此不关联,而异常并不一定发生在请求提交(即调用函数)时,平常的try/catch并不能有效的捕捉到程序的异常。

示例1:

1
2
3
4
5
6
7
try{
setTimeout(function(){
var data = a/1; //错误的计算
},1000);
}catch (e){
console.log(e);
}

因为计算并不会马上执行,所以即便是发生了错误,也无法捕获到相关信息,那么异步编程中应该如何处理异常的呢?请看示例2:

1
2
3
4
5
6
7
setTimeout(function(){
try{
var data = a/1; //错误的计算
}catch(e){
console.log(e);
}
},1000);

5.函数嵌套


os模块可提供操作系统的一些基本信息,它的一些常用方法如下:
函数嵌套
刚刚接触node.js的朋友们都有一个共同的烦恼,在进行较复杂的业务处理时,茫茫多的callback看得人头昏眼花,写着写着自己都糊涂了,更何况普遍患有强迫症的程序猿,面对如此难看的代码,如何能忍?

1
2
3
4
5
6
7
8
9
test1(function(v1){
test2(funciton(v1,function(v2){
test3(function(v2,fcuntion(v3){
test4(v3,function(v4){
callback(v4);
});
}));
}));
});

异步编程中,函数嵌套是一个普遍存在的问题,也因此常常被人诟病,如何解决函数嵌套,且看下回分解。

6.小结


非线性的思维只是因为和以前的习惯不太一样,才会觉得不太适应,但是长期使用锻炼你也会发现它并非一无是处。

异常捕获在node.js中也有了统一的约定,将异常信息作为回调函数的第一个实参传递给回调函数。 深层嵌套的问题也有很多解决办法。

思维方式 ===> 非线性思维需要多使用锻炼,适应这种思维方式。
异常捕获 ===> 遵守node.js统一的回调函数格式,将异常信息传入回调函数。
函数嵌套 ===> 相应解决方案,专门课程讲解。