您好,欢迎来到筏尚旅游网。
搜索
您的当前位置:首页js中的同步和异步

js中的同步和异步

来源:筏尚旅游网
js中的同步和异步

⼀、单线程

JavaScript 语⾔的⼀⼤特点就是单线程,也就是说,同⼀个时间只能做⼀件事,需要排队执⾏。如果前⾯的A任务会花费⼤量的时间,就会导致后⾯的B任务停⽌执⾏,知道A执⾏完才会执⾏B。如果排队是因为计算量⼤,CPU忙不过来,倒也算了,但是很多时候CPU是闲着的,因为IO设备(输⼊输出设备)很慢(⽐如Ajax操作从⽹络读取数据,进⾏⼤量计算),不得不等着结果出来,再往下执⾏。

console.log(Date.now());

console.log('===========');console.log(Date.now());

for (let i = 0; i < 100000000; i++) {}

console.log('=====');console.log(Date.now());

//输出

143336879 =========== 143336879 =====

143336922

前两个时间戳因为代码执⾏很快输出的时间戳相同,相隔⼀个for循环后,第三个时间戳输出与前两个相差较⼤相差43毫秒。

这个时候JavaScript语⾔的设计者意识到,这时主线程完全可以不管IO设备,挂起处于等待中的任务,先运⾏排在后⾯的任务。等到IO设备返回了结果,再回过头,把挂起的任务继续执⾏下去。⼆、同步和异步

为了防⽌主线程的不阻塞,异步⽅案产⽣。 所有任务可以分成两种,⼀种是同步任务(synchronous),另⼀种是异步任务

(asynchronous)。同步任务指的是:在主线程上排队执⾏的任务,只有前⼀个任务执⾏完毕,才能执⾏后⼀个任务;异步任务指的是:不进⼊主线程、⽽进⼊\"任务队列\"(task queue)的任务,只有\"任务队列\"通知主线程,某个异步任务可以执⾏了,该任务才会进⼊主线程执⾏。任务队列其实是⼀个先进先出的数据结构

(1)所有同步任务都在主线程上执⾏,形成⼀个执⾏栈(execution context stack)。

(2)主线程之外,还存在⼀个\"任务队列\"(task queue)。只要异步任务有了运⾏结果,就在\"任务队列\"之中放置⼀个事件。(3)⼀旦\"执⾏栈\"中的所有同步任务执⾏完毕,系统就会读取\"任务队列\",看看⾥⾯有哪些事件。那些对应的异步任务,于是结束等待状态,进⼊执⾏栈,开始执⾏。(4)主线程不断重复上⾯的第三步。

console.log(Date.now());

console.log('===========');console.log(Date.now());setTimeout(() => {

for (let i = 0; i < 100000000; i++) { }

console.log('异步2s');console.log(Date.now()); }, 2000)

setTimeout(() => {

for (let i = 0; i < 100000000; i++) { }

console.log('异步1s');console.log(Date.now()); }, 1000)

console.log('=====');console.log(Date.now()); //输出

14334680961=========== 14334680961 =====

14334680961 异步1s

14334682005异步2s

14334683012

⽤定时器(异步操作)将for循环包裹起来,使for循环成为异步操作,不进⼊主线程。进⼊队列任务开始执⾏。使三个时间戳的输出相近,不会因为for循环⽽等待⼤量时间。

异步1s输出的时间戳和前⼀个同步时间戳相差1044毫秒(减去for循环的43毫秒可看作1000毫秒了),异步2s和异步1s相差1007毫秒。意味着异步任务⼀进⼊队列任务就开始执⾏,执⾏完成后会在任务队列放置⼀个结果的事件。当同步认证执⾏完成后,会进⼊任务队列读取已经执⾏完成的异步任务的回调函数结果并输出。

单线程从从任务队列中读取任务是不断循环的,每次栈被清空后,都会在任务队列中读取新的任务,如果没有任务,就会等到,直到有新的任务,这就叫做任务循环,因为每个任务都是由⼀个事件触发的,因此也叫作事件循环三、异步回调函数的理解

普通函数是从上到下执⾏的,⽽异步函数你是不知道他在什么时候会执⾏完,但是你有想在他执⾏完的时候处理结果怎么办?使⽤回调函数,异步任务的回调函数会在这个异步任务执⾏完的时候进⾏调⽤,进⾏处理异步任务的数据。所以说普遍的异步任务都会有⼀个回调函数,进⾏数据的处理。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- efsc.cn 版权所有 赣ICP备2024042792号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务