4. 深刻理解异步和同步以及异步编程有哪些方式 同步的概念:执行一个方法或者功能,在没得到结果前,其他方法不执行,一定得等当前方法执行完,才会执行下一步骤 异步的概念:执行一个方法或者功能,不需要等待到当前方法执行完,其他方法也可以执行 一. Javascript异步编程 Javascript是单线程的,因此异步编程对其尤为重要 。
nodejs来说,外壳是一层js语言,这是用户操作的层面,在这个层次上它是单线程运行的,也就是说我们不能像Java、Python这类语言在语言级别使用多线程能力 。取而代之的是,nodejs编程中大量使用了异步编程技术,这是为了高效使用硬件,同时也可以不造成同步阻塞 。
不过nodejs在底层实现其实还是用了多线程技术,只是这一层用户对用户来说是透明的,nodejs帮我们做了几乎全部的管理工作,我们不用担心锁或者其他多线程编程会遇到的问题,只管写我们的异步代码就好 。二. Javascript异步编程的方法 在ES6之前,js主要的异步编程方式有3种:(1) 回调函数 异步调用一般分为两个阶段,提交请求和处理结果,这两个阶段之间有事件循环的调用,它们属于两个不同的事件循环(tick),彼此没有关联 。
异步调用一般以传入callback的方式来指定异步操作完成后要执行的动作 。而异步调用本体和callback属于不同的事件循环 。
一旦我们在异步调用函数中扔出一个异步I/O请求,异步调用函数立即返回,此时,这个异步调用函数和这个异步I/O请求没有任何关系 。//定义主函数,回调函数作为参数 function A(a,callback) { callback(); console.log('我是主函数'); }//定义回调函数 function B(){ setTimeout("console.log('我是回调函数')", 3000);//模仿耗时操作 }//调用主函数,将函数B传进去 A(2,B);//输出结果 我是主函数 我是回调函数 一下是nodejs 读取文件的列子://读文件后输出文件内容 var fs = require('fs'); fs.readFile('./text1.txt', 'utf8', function(err, data){ if (err){ throw err; } console.log(data); });假如读取多个文件嵌套式,回调少还好管理,多了就比较繁琐不容易维护,比较混乱,回调太多,这就是“回调地狱(callback hell)” var fs = require('fs'); fs.readFile('./text1.txt', 'utf8', function(err, data){ fs.readFile('./text1.txt', 'utf8', function(err, data){ fs.readFile('./text1.txt', 'utf8', function(err, data){ });});});由此,Promise的概念就由社区提出并实现,作用与回调方法几乎一致,都是在某种情况下执行预先设定好的方法,但是使用它却能够让代码变得更简洁清晰(2)事件监听(事件的订阅和发布)//jq 的注册侦听事件$(".ele").on("click",function(){ console.log("clicking");});//触发事件$(".ele").trigger("click");//nodejs发布和订阅事件 var events = require('events'); var emitter = new events.EventEmitter(); emitter.on('event1', function(message){ console.log(message); }); emitter.emit('event1', "message for you"); (3)ES6 Promise 在ES6发布了,Promise是异步编程的解决方案的一种 什么是Promise Promise是异步编程的一种解决方案,它有三种状态,分别是pending-进行中、resolved-已完成、rejected-已失败 当Promise的状态又pending转变为resolved或rejected时,会执行相应的方法,并且状态一旦改变,就无法再次改变状态,这也是它名字promise-承诺的由来 promise对象://实例化的Promise对象会立即执行 let promise = new Promise ( (resolve, reject) => { if ( success ) { resolve(a) // pending ——> resolved 参数将传递给对应的回调方法 } else { reject(err) // pending ——> rejectd } } ) Promise原型链上的then 方法.then()方法是Promise原型链上的方法,它包含两个参数方法,分别是已成功resolved的回调和已失败rejected的回调 Promise原型链上的catch 方法 Promise catch()的作用是捕获Promise的错误,与then()的rejected回调作用几乎一致 。