博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
异步的事件轮询机制
阅读量:6587 次
发布时间:2019-06-24

本文共 1454 字,大约阅读时间需要 4 分钟。

什么是异步

提起异步大家大家首先应该想到同步,首先解释一下什么是同步。同步即为按照顺序执行,下一任务需要等前一个任务执行完成后才可以开始。那异步是什么呢,简单理解就是和同步相反,他不用等待上一个任务完成就可以开始,像io操作,网络请求一般会采用异步的方式进行

JS是如何是实现异步操作的?

    js是单线程语言,JS的异步是通过回调函数实现的,即通过任务队列,在主线程执行完当前的任务栈(所有的同步操作),主线程空闲后轮询任务队列,并将任务队列中的任务(回调函数)取出来执行。"回调函数"(callback),就是那些会被主线程挂起来的代码。异步任务必须指定回调函数,当主线程开始执行异步任务,就是执行对应的回调函数。

    虽然JS是单线程的但是浏览器的内核是多线程的,在浏览器的内核中不同的异步操作由不同的浏览器内核模块调度执行,异步操作会将相关回调添加到任务队列中。而不同的异步操作添加到任务队列的时机也不同,如 onclick, setTimeout, ajax 处理的方式都不同,这些异步操作是由浏览器内核的 webcore 来执行的,webcore 包含上图中的3种 webAPI,分别是 DOM Binding、network、timer模块。

JS中的异步运行机制如下:  

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

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

异步的几种实现方式

  1. 回调函数
  2. 使用promise
  3. ES7的Async/Await   

    参考地址

    http://www.ruanyifeng.com/blog/2014/10/event-loop.html
    https://www.cnblogs.com/nullcc/p/5841182.html
    https://segmentfault.com/a/1190000011198232
    https://github.com/wangfupeng1988/js-async-tutorial/blob/master/part1-basic/02-event-loop.md

转载于:https://www.cnblogs.com/lan-cheng/p/10223455.html

你可能感兴趣的文章
Mysql加锁过程详解(5)-innodb 多版本并发控制原理详解
查看>>
script 里写 html 模版
查看>>
vue2.0 + vux (三)MySettings 页
查看>>
ASP.NET Core 使用 Alipay.AopSdk.Core 常见问题解答
查看>>
spring @Value 设置默认值
查看>>
带你从零学ReactNative开发跨平台App开发(十一)
查看>>
java 生成zip文件并导出
查看>>
atitit.userService 用户系统设计 v4 q316 .doc
查看>>
1224 - 搞定 iText 识别文字后翻译
查看>>
《iOS 8开发指南(第2版)》——第6章,第6.3节在Xcode中实现MVC
查看>>
机器人快速崛起:5年内消失510万工作岗位
查看>>
内存泄漏和内存溢出的区别
查看>>
pageinspect分析btree索引结构
查看>>
Jtable Auto Resize Column
查看>>
如何友好地展示findbugs分析报告
查看>>
postgresql 时间类型和相关函数
查看>>
JavaScript权威设计--JavaScript语言核心(简要学习笔记一)
查看>>
”一个封锁操作被对 WSACancelBlockingCall 的调用中断“。解决办法
查看>>
【原创】sysbench 使用总结
查看>>
android:theme决定AlertDialog的背景颜色
查看>>