js事件循环

2017-03-26

要是让我们来谈谈JavaScript这种语言的特点,我想很多人都会想到弱类型,解释型,事件驱动,单线程,原型继承等这几种描述。正是由于些特点,让我们在接触js的时候在类型转换和异步处理等方面踩了很多坑,但这又是JavaScript这门语言吸引人之处。这次我们由js的异步处理入手,来简单了解js为何是单线程的事件驱动的语言。

异步处理

何为异步处理?

计算机科学技术高度发达的如今,计算机的计算能力已经达到了每秒亿万级的级别了,多么复杂的计算也都轻松应对,但是包括网络请求,文件读取等操作会大大增加程序执行完毕的时间。因为网络传输速度和磁盘的读取速度远远不及CPU处理速度。因此我们提出了同步,异步,阻塞,非阻塞这些概念,可以简单地理解

1 老张把水壶放到火上,立等水开。(同步阻塞)老张觉得自己有点傻

2 老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞)老张还是觉得自己有点傻,于是变高端了,买了把会响笛的那种水壶。水开之后,能大声发出嘀~~~~的噪音。

3 老张把响水壶放到火上,立等水开。(异步阻塞)老张觉得这样傻等意义不大

4 老张把响水壶放到火上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶。(异步非阻塞)老张觉得自己聪明了。

同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)
所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。换句话说,就是由调用者主动等待这个调用的结果。
而异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在调用发出后,被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用。

阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.
阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。

传统的AJAX回调

上面的例子已经能看出


Comments: