javascript异步编程之执行模式

为了解决耗时任务阻塞的这种问题,JavaScript的语言将任务的执行模型分成了两种

  • 同步模式(Synchronous)
  • 异步模式(Asynchronous)

一、同步模式

同步模式指的是代码当中的任务依次执行,后一个任务必须要等待前一个任务结束才能够开始执行;程序的执行顺序跟我们代码的编写顺序是完全一致的,也就是说这种方式会比较简单;那在单线程情况下,我们大多数的任务都会以同步模式去执行,注意这里所说的同步并不指的的是同时执行,而是排队执行。

同步模式的图栗

总结,这里的调用栈只是一个更专业的说法,更通俗一点的解释就是js在执行引擎当中维护了一个正在工作的工作表,或者说正在执行的一个工作表,在这个里面会记录当前正在做的一些事情,当工作表当中所有的任务全部被清空过后,这一轮的工作就算是结束了,这是一个纯同步模式执行下的一个情况,所以特别容易理解。因为它的执行过程非常符合我们正常的阅读逻辑或者说是思考逻辑。不过这种排队执行的机制,他也存在一个很严重的问题,就是如果其中的某一个任务或者更具体的说某一行代码,他执行的时间过长,那他后面的任务就会被延迟,这种延迟可以称之为阻塞;这种阻塞对于用户而言就意味着界面会卡顿或者卡死,所以就必须要有异步模式来去解决我们程序当中那些无法避免的耗时操作,例如在浏览器端的ajax操作,或者在node.js中大文件的读写,都会需要用到异步模式去执行从而避免代码被卡死。

二、异步模式

异步模式的api是不会等待这个任务的结束才开始执行下一个任务,对于耗时操作它都是开启过后就立即往后执行下一个任务;那耗时任务的后续逻辑一般会通过回调函数的方式去定义,在内部呢这个耗时任务完成过后就会自动执行我们这里传入的回调函数。

异步模式对于JavaScript来说非常重要,因为如果没有这种模式的话,单线程的JavaScript语言就无法同时处理大量耗时任务;而对于开发者而言,单线程模式下面的异步,它最大的难点就在于代码的执行顺序并不会像同步代码那样通俗易懂,因为它的执行顺序相对会比较跳跃,是需要理解和习惯,需要多看,多练,多思考。

异步模式图栗

如果说调用栈是一个正在执行的工作表,那消息队列就可以理解成一个代办的工作表,而js引擎就是先去做完调用栈当中所有的任务,然后再通过事件循环,从消息队列当中,再依次取一个任务出来放到调用栈中继续去执行,以此类推,整个过程,随时都可以往消息队列当中再去放入一些任务,这些任务在消息队列当中会排队等待事件循环 

以上就是异步调用在JavaScript的实现过程和它的基本原理,整个过程都是通过它内部的消息队列和事件循环去实现的。

js线程图栗 

js线程在某个时刻发起了一个异步调用,然后紧接着继续执行往后的其它任务,此时异步的线程会单独的执行整个异步任务,然后再执行完这个任务过后,会将这个任务的回调放入到消息队列中,js的主线程会完成所有的任务过后,再依次执行消息队列当中的任务

注意:JavaScript 确实是单线程的,而浏览器它并不是单线程的,具体来说就是,通过JavaScript调用的某些内部 的api,他并不是单线程的,例如所使用的倒计时器,他内部就会有一个单独的线程去负责倒数,在时间到了过后,会将回调放入到消息队列,也就是说这一件事情是有一个单独的线程去做的,而我们所说的单线程指的是执行代码的一个线程,而这些内部的api它们自己会用单独的线程去执行这些等待的操作,而这里的等指的是不会让js线程去等。

因此,这里的同步和异步不是指的是写代码的方式,而是运行环境提供的api它到底是以同步还是异步的模式去工作的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值