这两天又看了看promise 的相关内容,做个复习总结。 promise 是es6中提出的js异步解决方案,其实我一直不理解这句话,异步解决方案到底解决的是什么问题。说到这个问题我们就要说到,js语言的执行机制,js是一种脚本语言,是一种单线程语言,所有的代码都必须逐行执行js 单线程是指:解析js的引擎是按单线程去解析js 的
单线程任务也称作为同步任务: 程序语言中的同步与现实生活中的同步恰好是相反的概念,js语言中的同步是指,必须先执行完上一步的程序,在执行下一步的程序,而不是同时执行。
同步任务:先执行完上面的程序,再执行下面的程序,如果程序执行不下去有问题叫做线程阻塞。 异步任务:是指同时执行不同程序,异步就是用来解决线程阻塞的问题,因为某个程序耗时太久,导致后面的程序无法执行,
同步:所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。也就是必须一件一件事做,等前一件做完了才能做下一件事
异步:异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者
但是js还有任务队列的概念,像一些定时器函数,包括promise函数都会放到任务队列里面等到同步代码执行完成之后才会去队列中执行这些函数。
其实我一直不理解的是,比如说一段程序,执行到第三行,假如这行语句需要很久才能执行完成,例如io操作,那么为了不阻塞后面的语句的执行,会把该语句放到任务队列中,从而继续执行后面的语句,等到后面的语句执行完成后,再去执行该耗时比较久的语句,此时该语句应该也会有了执行结果,这样就实现了非阻塞执行,而且看起来就像是异步似的。那么我疑问的是,放到队列中的语句到底是由谁来执行的呢?js是单线程语言,主线程一直在执行主任务,谁来执行的异步,其实异步任务会被对应模块解析(饭被电饭煲模块解析)。那么这就和宿主有关系了,js一般都是运行在浏览器上(当然有node.js),也就是寄生在浏览器上,那么宿主就是游览器。
所以是宿主提供的模块去处理这些异步任务,使得js可以实现与其他语言类似的多线程操作。 zhuanlan.zhihu.com/p/363828245 参考这个博主的解释
浏览器常驻线程
- 渲染引擎线程:顾名思义,该线程负责页面的渲染
- JS引擎线程:负责JS的解析和执行
- 定时触发器线程:处理定时事件,比如setTimeout, setInterval
- 事件触发线程:处理DOM事件
- 异步http请求线程:处理http请求
上面的浏览器的常驻线程帮助js实现了一些异步方法的执行。