异步模式Asynchronous不会等到本次任务结束才开始执行下一个任务。打开后,会立即执行下一个任务。后续逻辑一般会通过回调函数的方式来定义。异步模式对于js来说是非常重要的。没有异步任务,单线程的js语言无法同时处理大量的耗时任务。单线程下异步最大的难点在于代码的执行顺序混乱。Queue是消息队列队列,也叫回调队列。打印消息是同步执行的。入栈出栈,接下来是倒计时,setTimeOut是调用webapi,单独运行的webapi不会阻塞js的执行,开启倒计时后,setTimeOut的调用是结束了,会继续往下调用,同理压栈开启倒计时弹出栈。打印完最后一条消息后,调用了匿名函数。这个时候我们的调用栈就会被清空。当执行调用栈时,Evevt循环会从消息队列中取出第一个。回调函数被压入调用栈,当倒计时到达时间,回调函数将被放入回调队列。timer2的倒计时先结束,所以会放在消息队列的最前面。当Evevt循环检测到消息队列发生变化时,会将timer2放入执行栈中执行。这时候对于调用栈来说是一个新的开始。一轮执行,如果执行栈中的函数再次启动定时器,此时和之前的步骤一样,不断的加入消息队列,不断的取出消息队列中的函数执行,直到调用栈和需要执行的函数的全部代码不在消息队列中,javascript执行引擎是先执行调用栈中的任务,然后通过事件循环从消息队列中取出另一个任务执行,等等。我们可以随时将任务放入消息队列,这些任务会被排队等待执行。javascript异步实现的原理是通过消息队列和时间循环实现的回调函数。所有异步编程方案基本上都是回调函数,由调用者定义,交给执行者执行。Functionfoo(callback){setTimeOut(()=>{callback()},3000)}foo(()=>{console.log("Qiafanfan")})原文地址:https://kspf.xyz/archives/19更多内容微信公众号搜索做饭充饥的小程序搜索关于煮饭的博客
