首先,我们要知道,JavaScript的本质是一门浏览器脚本语言,在执行的时候是一行一行的执行,只有前面的代码执行完了才会执行后面的代码。JS是单线程语言指的就是这个意思。

同步和异步其实在进行任务执行顺序时候都只有一条流水线,区别在于执行任务的顺序不同。

对于同步任务和异步任务,打个比喻:

有一堆学生在食堂排队打饭,然后进门的时候有些学生领了个异步的牌子,有些学生没有领,然后在窗口前排队打饭的时候,食堂大叔规定,有异步牌子的学生出来重新组成一个小队列,在窗口旁边等待,没有牌子的学生仍然在窗口前的主队里排队打饭。等主队里没有牌子的学生排队打完饭之后,食堂大叔示意小队列里有异步牌子的学生一个个的过来打饭。

抛开这个场景不谈,在js中,同步和异步的概念,有很多博主的解释就是“同步就是任务一个接一个的执行,前面的没有执行完成后面的就一直等待”,“异步就是觉得一个任务要执行会花很长时间,所以先放着,去执行其他的任务,等轮到这个任务的时候再执行。”

很多小伙伴看到这里就懵逼了,怎么着,系统还能识别哪个任务执行时间长哪个短?有这么智能好用的系统?要是系统自动识别执行时长,任务管理不会乱套?所以,我个人觉得这些博主的描述是有很大问题的。

一个任务是否是异步的是看程序员在编写代码的时候是否将这个任务设置为异步,而不是说时间长的任务就一定是异步的,只是通常来讲为了流畅性,编程者会将执行时间长的任务主观的设置为异步。

所以说只要编程者不人为的对任务的执行顺序进行干涉,那么任务就是同步的,会一条一条的执行。但是只要编程者人为的对某些任务的执行顺序进行干涉,就是进行异步操作。

那么这里就涉及到一个问题了,怎么将一个任务设置为异步?

JS中最基础的有两种方式——setTimeout函数和setInterval函数。

如下代码:

 <script type="text/javascript">
console.log('1');
setTimeout(function(){
console.log('2');
},0)
setTimeout(function(){
console.log('3');
},0)
setTimeout(function(){
console.log('4');
},0)
console.log('5');
</script>

上述代码输出顺序为:1  5  2  3  4

其中因为2 3 4的输出语句使用了setTimeout函数将其设定了等待时间(虽然设置的等待时间为0),所以它们3个被抽出来放在了另外的队列里,只有没被特别设置的任务按顺序执行完之后才会开始执行这个特殊队列的任务。所以会先把正常的1 5打印,然后才会开始打印2 3 4

这里我们会发现,1和5是按一般顺序打印,因为JS是逐行执行的。但是同为异步任务的2 3 4的打印任务也是按照2 3 4的顺序打印,是受加入队列的顺序影响。那么是不是说异步任务组成的队列里执行顺序和加入异步队列的顺序有关呢?并不是。只有异步任务的等待时间相同的时候,异步任务的执行顺序才会收到计入队列的顺序影响。否则的话主要还是与每个任务设置的等待时间有关系。

例如下面这种情况:

 <script type="text/javascript">
console.log('1');
setTimeout(function(){
console.log('2')
},300)
setTimeout(function(){
console.log('2')
},200)
setTimeout(function(){
console.log('2')
},100)
console.log('5');
</script>

与等待时间有关

上述代码的输出顺序为1  5  4  3  2

因为异步任务设置的等待时间不同,在同步任务执行完后,等待时间较短的任务优先执行,等待时间长的后执行。

把这些都搞清楚之后我们又难免会思考,这样的异步操作都是对于只需要执行一次的任务进行排序,假如是要对多个需要按一定顺序循环执行的异步任务呢?这个时候就需要用到promise队列的链式调用,并且使用一个全局变量,在每完成一次循环后重置全局变量的值,并且在循环执行前检查该全局变量的值。

详细思路和是西安方法可以参考以下这篇博文。

关于JS下大批量异步任务按顺序执行解决方案

JS中同步和异步的更多相关文章

  1. js中同步与异步处理方法

    在使用异步请求时,有时需要将异步请求的结果返回给另一个js函数,此种情况下会出现未等异步请求返回请求结果,该发送请求所在js函数已经执行完后续操作,即已经执行return ,这样会导致return的结 ...

  2. js中同步与异步请求方式

    异步请求方式: $.ajax({ url : 'your url', data:{name:value}, cache : false, async : true, type : "POST ...

  3. JS中同步与异步

    不讲过多定义,举两个例子说明下 例一: console.log(100); setTimeout(function(){ console.log(200); },1000); console.log( ...

  4. 在JavaScript中同步与异步

    在JavaScript中,一个线程执行的时候不依靠其他线程处理完毕我们称为异步,相反一个线程必须等待直到另一个线程处理完毕我们则称为同步.打个比方: (1)同步就是你在煮方便面的时候必须等水开了,你才 ...

  5. JS中同步与异步的理解

    你应该知道,javascript语言是一门“单线程”的语言,不像java语言,类继承Thread再来个thread.start就可以开辟一个线程,所以,javascript就像一条流水线,仅仅是一条流 ...

  6. HTTP请求中同步与异步有什么不同

    普通的B/S模式就是同步,而AJAX技术就是异步,当然XMLHttpReques有同步的选项. 同步:提交请求->等待服务器处理->处理完毕返回.这个期间客户端浏览器不能干任何事. 异步: ...

  7. JS的同步和异步加载

    引言 JS的“加载”不能理解为下载,它是分为两个部分:下载,执行.默认的JS加载是同步的,因为浏览器需要一个稳定的DOM结构,而执行JS时可能会对DOM造成改变,所以在执行JS时一定会阻塞HTML的渲 ...

  8. js的同步与异步

    JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事.那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊. JavaScript的单线程,与它的用途有关.作为 ...

  9. IO中同步、异步与阻塞、非阻塞的区别

    一.同步与异步同步/异步, 它们是消息的通知机制 1. 概念解释A. 同步所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回. 按照这个定义,其实绝大多数函数都是同步调用(例如si ...

随机推荐

  1. tab-switch 样式的添加 与 tab元素样式的切换

    要点: 1.多个div类名相同情况下添加class样式 2.siblings() 方法返回被选元素的所有同级元素.DOM 树:该方法沿着 DOM 元素的同级元素向前和向后遍历. 3.利用索引,只添加当 ...

  2. 移除VS解决方案中的TFS版本控制

    项目每次会弹出提示 正在打开的解决方案已绑定到以下 Azure DevOps Server 上的源代码管理: xxxxx.是否要联系此服务器以尝试启用源代码管理集成? 移除VS解决方案中的TFS版本控 ...

  3. 上位机开发之西门子PLC-S7通信实践

    写在前面: 就目前而言,在中国的工控市场上,西门子仍然占了很大的份额,因此对于上位机开发而言,经常会存在需要与西门子PLC进行通信的情况.然后对于西门子PLC来说,通信方式有很多,下面简单列举一下: ...

  4. Flask 的模板渲染

    Flask 的模板渲染 渲染模板语言和django很像,都是用{{}},{%%} 注意点: 1 flask给模板传值,render_template("index.htm",use ...

  5. App接口设计之token的php实现

    为了保证移动端和服务端数据传输相对安全,需要对接口进行加密传输. 一.ttoken的设计目的:  因为APP端没有和PC端一样的session机制,所以无法判断用户是否登陆,以及无法保持用户状态,所以 ...

  6. Alink漫谈(七) : 如何划分训练数据集和测试数据集

    Alink漫谈(七) : 如何划分训练数据集和测试数据集 目录 Alink漫谈(七) : 如何划分训练数据集和测试数据集 0x00 摘要 0x01 训练数据集和测试数据集 0x02 Alink示例代码 ...

  7. 深入理解Js数组

    深入理解Js数组 在Js中数组存在两种形式,一种是与C/C++等相同的在连续内存中存放数据的快数组,另一种是HashTable结构的慢数组,是一种典型的字典形式. 描述 在本文中所有的测试都是基于V8 ...

  8. 2019-02-02 Python学习——生成器杨辉三角,迭代器与可迭代对象的区别

    练习 杨辉三角定义如下: 1 / \ 1 1 / \ / \ 1 2 1 / \ / \ / \ 1 3 3 1 / \ / \ / \ / \ 1 4 6 4 1 / \ / \ / \ / \ / ...

  9. php 判断设备是手机还是平板还是pc

    1 <?php 2 //获取USER AGENT 3 $agent = strtolower($_SERVER['HTTP_USER_AGENT']); 4 5 //分析数据 6 $is_pc ...

  10. 找到了两个联想的OEM XP镜像文件

    今天在收拾移动硬盘的时候发现了两个XP镜像 还都是联想的,一个有OOBE,另一个无OOBE,全传网盘里了,需要的自取 有个疑问 2020年还有多少家庭电脑和ATM机器还在用XP??? link:htt ...