博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript异步
阅读量:5788 次
发布时间:2019-06-18

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

有这样一段代码:

function fn1(callback){setTimeout(function () {callback();}, 1000);}复制代码

这是一个异步编程的代码,刚开始的时候我一直绕不出来,何为异步?我想到了ajax的异步,但是还是没明白,查了很多讲解,越看越不明白,最后找到了任务队列和主线程,才明白了什么叫异步。

我们都知道JavaScript最大的特点就是单线程,单线程限制了任务必须排队,等待前面的任务执行完了才能下一个任务。这也叫同步,同步的意思就是必须等上一个任务执行完毕才能执行下一个任务。

alert(888);while (true){    alert(999);};alert(777);复制代码

在JavaScript线程中会先弹出888,然后一直循环弹出999,因为这个while一直占据着线程,777又必须等待上一个任务执行完毕,所以陷入了死循环,这就是同步。

同步就是这样,如果前一个任务耗时很长甚至是陷入循环,那么后一个任务不得不等着,于是一个任务队列的概念就出来了。比如我们在ajax操作的时候,我们不可能真的等请求回来了再执行另外的任务。

所以JavaScript把任务分成了两种,一种是同步任务,另一种是异步任务。同步任务就是在主线程上面排队执行,异步任务是不进入主线程,而是进入任务队列,当主线程从头到尾执行完毕之后,就会把任务队列的任务提到主线程,然后按同步任务的方式从头到尾执行。当再执行完毕之后,又会去任务队列再一次重复上面的操作,直到所有的任务执行完毕。

简单来说过程是这样的:

1、 主线程执行所有同步任务,形成一个执行栈;

2、 在主线程执行的过程中形成的异步任务,会进入任务队列;

3、 当执行栈中所有的同步任务队列执行完毕,任务队列自动进入执行栈,变成同步任务;再次期间形成的异步任务进入新的任务队列;

4、 主线程不断重复上面的步骤。

这就是JavaScript的运行机制,如下代码:

console.log( "1" );setTimeout(function() {    console.log( "2" )}, 0 );setTimeout(function() {    console.log( "3" )}, 1000 );setTimeout(function() {    console.log( "4" )}, 2000 );setTimeout(function() {    console.log( "5" )}, 3000 );console.log( "6" );//1 6 2 3 4 5复制代码

每隔一秒就会有一个任务队列,主线程执行完毕就会把任务队列变成主线程执行,直到没有任务。

异步其实挺简单的,可能本人刚开始进入了误区,理解异步可以让我们对于JavaScript的执行原理有一定的理解。

欢迎关注Coding个人笔记 公众号

转载于:https://juejin.im/post/5c52c0b151882542ff129911

你可能感兴趣的文章
javascript实现的一个信息提示的小功能/
查看>>
Centos7.x:开机启动服务的配置和管理
查看>>
HTML5 浏览器返回按钮/手机返回按钮事件监听
查看>>
xss
查看>>
iOS:百度长语音识别具体的封装:识别、播放、进度刷新
查看>>
JS获取服务器时间并且计算距离当前指定时间差的函数
查看>>
华为硬件工程师笔试题
查看>>
jquery居中窗口-页面加载直接居中
查看>>
cd及目录快速切换
查看>>
Unity Shaders and Effects Cookbook (3-5) 金属软高光
查看>>
31-hadoop-hbase-mapreduce操作hbase
查看>>
C++ 代码风格准则:POD
查看>>
linux-友好显示文件大小
查看>>
【转】【WPF】WPF中MeasureOverride ArrangeOverride 的理解
查看>>
【转】二叉树的非递归遍历
查看>>
NYOJ283对称排序
查看>>
接连遇到大牛
查看>>
[Cocos2d-x For WP8]矩形碰撞检测
查看>>
自己写spring boot starter
查看>>
花钱删不完负面消息
查看>>