异步编程 :异步编程 简介

什么是异步编程?

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

示例:

console.log('hi!');
setTimeout(function(){
   console.log('hello!');
},1000);
console.log('wow!');从示例中可以看到,hello是在wow输出后才输出的,因为setTimeout函数设置了延迟1000毫秒才异步执行,function(){ console.log('hello'); }就是异步回调函数,这样的编程风格就是异步编程。

优势

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

  1. 性能:相对于多线程,异步I/O没有了线程间的上下文切换开销,由此带来可观的性能提升是选择它的主要原因。
  2. 成本:由于性能的提升,相同的硬件可以发挥更大的作用,变相的降低了运营成本,由于node.js采用javascript作为开发语言,而javascript的使用已经非常广泛,所以降低了node.js的学习成本。
  3. 效率:node.js采用javascript作为开发语言,使前后端开发语言统一,不需要切换开发语言,使开发效率更高,加之javascript使用者众多,使得node.js迅速的流行起来。

不符合线性思维习惯

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

实例 - 获取数据

线性表达

var data = getData(id);异步编程:
getData(id,function(data){
   //在回调函数中才能获取到data数据
});

思维模式的转换是异步编程初学者遇到的难点之一,要克服这个问题没有什么捷径可走,只有长期的使用锻炼,以适应这样的思维模式。

异常捕获

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

示例:

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

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

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

函数嵌套

刚刚接触node.js的朋友们都有一个共同的烦恼,在进行较复杂的业务处理时,茫茫多的callback看得人头昏眼花,写着写着自己都糊涂了,更何况普遍患有强迫症的程序猿,面对如此难看的代码,如何能忍?

test1(function(v1){
  test2(funciton(v1,function(v2){
    test3(function(v2,fcuntion(v3){
      test4(v3,function(v4){
        callback(v4);
      });
    }));
  }));
});

异步编程中,函数嵌套是一个普遍存在的问题,也因此常常被人诟病,如何解决函数嵌套,后面的课程将专门讲解这个问题。

课程小结

在学习node.js的时候,异步编程往往成为了初学者的一个烦恼,面对非线性的思维、异常难以捕获、嵌套的忧虑等问题就放弃了。

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

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

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