你可能知道,Javascript语言的执行环境是"单线程"(single thread)。所谓"单线程",就是指一次只能完成一件任务。js发明者之所以设置为单线程,是基于js的应用场景,最初的js是用来操作dom的,优化用户体验的,由于用户同一时间只能做一件事,会减少bug,(比如同时添加或者删除dom),所以设置为单线程
单线程同步执行
如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推。虽然这是js执行原理,但是我们在项目中,难免会遇到一些实际问题,这就是现实与理想的差距,我们理想的是按步骤执行,避免出错。
任务队列异步循环执行
但是如果项目比较大,而且某些函数非常占内存,耗时间,比方有10个函数排队执行,第二个函数里面有一个异步setTimeout函数等待50秒后console.log("时间到"),难道我们让所有函数都去等待这50秒吗?不会的,我们要开始变通了,这时候就出现了任务队列,所有异步操作被放到了任务队列里面排队,数据结构为栈,先存先执行,注:所有的异步操作都是在同步程序执行完毕后才开始从任务队列转移到主线程执行,循环判断是否还有未执行异步任务
process.nextTick:
在同步操作之后,异步操作之前
setImmediate:
当循环结束进行