js中的同步和异步

in js with 0 comment views: 592 times

js 线程

js是单线程的,不能同时进行多个任务和流程。

同步和异步

同步和异步的不同就在于对代码的执行顺序不同。

console.log( "1" );
setTimeout(function() {
    console.log( "2" )
}, 0 );
setTimeout(function() {
    console.log( "3" )
}, 100 );
setTimeout(function() {
    console.log( "4" )
}, 0 );
console.log( "5" );

这段代码就是异步的,执行结果是:

1
5
2
4
3

任务队列

js是单线程的,单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。如果前一个任务耗时很长,后一个任务就不得不一直等着。于是就有一个概念,任务队列。

如果排队是因为计算量大,CPU忙不过来,倒也算了,但是很多时候CPU是闲着的,因为IO设备(输入输出设备)很慢(比如Ajax操作从网络读取数据),不得不等着结果出来,再往下执行。

JavaScript语言的设计者意识到,这时主线程完全可以不管IO设备,挂起处于等待中的任务,先运行排在后面的任务。等到IO设备返回了结果,再回过头,把挂起的任务继续执行下去。

于是,所有任务可以分成两种,一种是同步任务(synchronous),另一种是异步任务(asynchronous)。同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;异步任务指的是,不进入主线程、而进入"任务队列"(task queue)的任务,只有"任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。

具体来说,异步执行的运行机制如下。(同步执行也是如此,因为它可以被视为没有异步任务的异步执行。)

代码解释

console.log( "1" );
setTimeout(function() {
    console.log( "2" )
}, 0 );
setTimeout(function() {
    console.log( "3" )
}, 100 );
setTimeout(function() {
    console.log( "4" )
}, 0 );
console.log( "5" );

代码会从上到下执行


参考: http://www.ruanyifeng.com/blog/2014/10/event-loop.html


Responses