Node.js异步编程
在Node.js中有两种API,分别是同步API和异步API。
同步API:只有当前API执行完成后,才能继续执行下一个API。也就是说代码一行一行地执行,上一条代码执行完才能执行下一条代码。
异步API:当前API的执行不会阻塞后面代码的执行。
同步API和异步API的区别:同步API可以从返回值中拿到API的执行结果,但是异步API不可以。异步API是通过回调函数的方式拿到返回值的。
//异步AIP
function getMsg(callback){ setTimeout(function ()=>{ callback({ msg:'hello,async!' }) },2000) } getMsg(function(data){ console.log(data); })
当有一个异步的执行时间为0秒后时,执行结果是怎样的呢?
console.log('代码开始执行'); setTimeout(() => { console.log('2秒后执行的异步'); },2000); setTimeout(() => { console.log('0秒后执行的异步'); },0); console.log('代码执行结束'); //执行结果为: // 代码开始执行 // 代码执行结束 // 0秒后执行的异步 // 2秒后执行的异步
node.js从上到下执行代码时,并不是遇到什么执行什么,而是先将所有的同步API执行完,再去执行异步API 。
代码的执行顺序:
- 首先代码从上到下依次执行,第一条代码 console.log('代码开始执行'); 是同步API,会被放到同步代码执行区执行,输出 代码开始执行。
- 接下来是一个是定时器,是异步API。会被放到异步代码执行区中,紧接着,会把异步API所对应的回调函数放到回调函数队列当中。⚠️注意:不管是异步代码执行区里的代码还是回调函数队列里的代码都是没有执行的。
- 接下来又遇到了一个0秒后执行的定时器,node.js不管时0秒还是2秒都会放到异步代码执行区,然后把异步API对应的回调函数放到回调函数队列当中。
- 代码继续向下执行,最后一条代码是 console.log('代码执行结束'); 被放到同步代码执行去执行,输出 代码执行结束。自此,所有的同步API执行完毕。node.js转到异步执行区依次执行代码。由于第二个定时器在0秒之后就要执行,马上执行完毕,执行完后node.js会在回调函数队列中找到第二个定时器对应的回调函数并拿到同步代码执行区执行。输出 0秒后执行的异步
- 等待2秒后,第一个定时器也执行完了,node.js会在回调函数队列中找到第一个定时器对应的回调函数并拿到同步代码执行区执行。输出 2秒后执行的异步