资源描述:
《什么是异步编程.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、什么是异步编程?异步编程是指由于异步I/O等因素,无法同步获得执行结果时,在回调函数中进行下一步操作的代码编写风格,常见的如setTimeout函数、ajax请求等等。示例:console.log('hi!');setTimeout(function(){console.log('hello!');},1000);console.log('wow!');从示例中可以看到,hello是在wow输出后才输出的,因为setTimeout函数设置了延迟1000毫秒才异步执行,function(){console.log('hello');}就是异步回调函数,这
2、样的编程风格就是异步编程。优势为什么选择node.js?它有哪些优势呢?1.性能:相对于多线程,异步I/O没有了线程间的上下文切换开销,由此带来可观的性能提升是选择它的主要原因。2.成本:由于性能的提升,相同的硬件可以发挥更大的作用,变相的降低了运营成本,由于node.js采用javascript作为开发语言,而javascript的使用已经非常广泛,所以降低了node.js的学习成本。3.效率:node.js采用javascript作为开发语言,使前后端开发语言统一,不需要切换开发语言,使开发效率更高,加之javascript使用者众多,使得node
3、.js迅速的流行起来。Javascript普及度高也是node.js迅速发展的一种优势。不符合线性思维习惯虽然异步会带来很多好处,但是也衍生了很多问题。异步编程在流程控制中业务表达不太适合自然语言的线性思维习惯。实例-获取数据线性表达vardata=getData(id);异步编程:getData(id,function(data){
//在回调函数中才能获取到data数据
});异常捕获异步I/O的实现主要有两个阶段,①提交请求;②处理结果;这两个阶段彼此不关联,而异常并不一定发生在请求提交(即调用函数)时,平常的try/catch并不能有效的捕捉到
4、程序的异常。示例:try{setTimeout(function(){vardata=a/1;//错误的计算},1000);}catch(e){console.log(e);}因为计算并不会马上执行,所以即便是发生了错误,也无法捕获到相关信息,那么异步编程中应该如何处理异常的呢?请看示例2:setTimeout(function(){try{vardata=a/1;//错误的计算}catch(e){console.log(e);}},1000);异步编程中,异常的捕获方式也有所不同。函数嵌套刚刚接触node.js的朋友们都有一个共同的烦恼,在进行较复杂
5、的业务处理时,茫茫多的callback看得人头昏眼花,写着写着自己都糊涂了,更何况普遍患有强迫症的程序猿,面对如此难看的代码,如何能忍?test1(function(v1){test2(funciton(v1,function(v2){test3(function(v2,fcuntion(v3){test4(v3,function(v4){callback(v4);});}));}));});异步编程中,函数嵌套是一个普遍存在的问题,也因此常常被人诟病,如何解决函数嵌套,后面的课程将专门讲解这个问题。异步编程是学习node.js的第一步什么是高阶函数高
6、阶函数是异步编程的基础,那么什么是高阶函数呢?高阶二字听起来有点高大上的感觉,其实不然,高阶函数与普通函数不同的地方是高阶函数可以把函数作为参数,或者是将函数作为返回值,请看如下示例。示例:functiontest(v){returnfunction(){returnv;}}示例中是一个最简单的高阶函数,如你所见,高阶函数test的返回值是一个匿名函数。定义一个高阶函数test,test有两个参数a和b,test返回一个将a和b相加的匿名函数。functiontest(a,b){returnfunction(){returna+b;}}现实应用虽然有可
7、能是第一次真正的去了解什么是高阶函数,但是其实我们在日常开发中经常会用到它,只是我们没有去留意或者说不知道它的称谓而已。示例:数组的排序(sort)函数vartest=[5,34,87,32,56,2,17];将数组test按从大到小进行排序,并打印排序结果。偏函数什么是偏函数?假设有一个参数或变量已经预置的函数A,我们通过调用A来产生一个新的函数B,函数B就是我们说的偏函数,有点拗口?请看示例:varisType=function(type){returnfunction(obj){returntoString.call(obj)=='[object
8、'+type+']';}};varisString=isType('String');vari