84669 person learning
152542 person learning
20005 person learning
5487 person learning
7821 person learning
359900 person learning
3350 person learning
180660 person learning
48569 person learning
18603 person learning
40936 person learning
1549 person learning
1183 person learning
32909 person learning
大家用言简意赅的语言,讲讲JavaScript的异步实现机制。 参考帮助:http://www.cnblogs.com/sprying/archive/2013/05/26/3100639.html
认证0级讲师
js能异步是因为它用能调用的模块是异步的。
js永远都是单线程的。(当然,如果你非要说work),而且只有一个事件队列(你也可以理解成任务队列) 他之所以异步是是因为 某些的模块是异步的。 举个栗子,ajax 当你发送一个异步网络请求后,js的主线程不会一直等待这个请求返回,而是执行事件队列里下一个事件。 请注意,js并没有实现如何发送网络请求,js只是调用了某个能发送网络请求的模块,而这个模块是通过c++或其他语言实现。然后这个模块在等待请求的结果,当得到响应后,便把响应成功这个事件添加到js的事件队列的队尾。 你看,网络请求发送的同时,js依然在执行,这显然是异步的。
这篇文章的重点就是这一句了:
我们必须清楚一点,触发和执行并不是同一概念,计时器的回调函数一定会在指定delay的时间后被触发,但并不一定立即执行,可能需要等待。所有JavaScript代码是在一个线程里执行的,像鼠标点击和计时器之类的事件只有在JS单线程空闲时才执行。
js能异步是因为它用能调用的模块是异步的。
js永远都是单线程的。(当然,如果你非要说work),而且只有一个事件队列(你也可以理解成任务队列)
他之所以异步是是因为 某些的模块是异步的。
举个栗子,ajax
当你发送一个异步网络请求后,js的主线程不会一直等待这个请求返回,而是执行事件队列里下一个事件。
请注意,js并没有实现如何发送网络请求,js只是调用了某个能发送网络请求的模块,而这个模块是通过c++或其他语言实现。然后这个模块在等待请求的结果,当得到响应后,便把响应成功这个事件添加到js的事件队列的队尾。
你看,网络请求发送的同时,js依然在执行,这显然是异步的。
这篇文章的重点就是这一句了: