1.首先我们需要理解的是js中for循环、forEach循环、map循环的一些差异性,直接说了为后面说到的提供一些依据

  1.1 for循环最基本,也是最容易理解的。

  1.2 forEach和map用法类似,

  相同点:

      都可以遍历到数组的每个元素,而且参数一致(数组中的当前项item,当前项的索引index,原始数组input)

  不同点:

     forEach() 方法对数组的每个元素执行一次提供的函数。总是返回undefined;

      map() 方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果。返回值是一个新的数组(但是不会改变原数组的);
  写法如下:
 var ary = [1,2,3,4,5];
1.forEach()
//无返回值,undefined
ary.forEach(function(value,index,array){
  //do something
},this) 2.map()
//有返回值,可以return 出来
ary.map(function(value,index,array){
  //do something
  return XXX
},this)

2 现在我们开始理解多异步操作的思想,假设我们当前有这么一个场景:列表有五个页签,我们需要分别获取这五个页签的某些数据,并且依次按照顺序打印出来

  2.1 获取某个页签的数据方法是一个异步的,这时候我们打算采用一个for循环

 async function UpdateClientCache(){
//debugger
console.log('begin')
console.log(new Date())
let arrList = [1,2,3]
let result = []
for (const iterator of arrList) {
result.push(await this.getLMxTableInfo(iterator))//getLMXTableInfo()是一个异步的操作
}
console.log('end')
console.log(result)
console.log(new Date())
}, //不难想象输出的result依次存放在异步操作每次返回的结果,且下一个异步操作getLMXTableInfo()的执行都是在上一次的返回后,及继发的关系

  2.2 如果我们把上面的for-of循环改成forEach呢?如果改成map呢?

 UpdateClientCache(){
//debugger
console.log(new Date())
let arrList = [1,2,3]
let result = []
let promises = arrList.map((doc) =>common.getLMxTableInfo(doc));
result = await Promise.all(promises);
console.log(result)
console.log(new Date())
},     //实际上每次执行异步操作是并行,不依靠上次的返回值,节省操作时间,并且依次返回值(这里大家可以实际去操作,通过new sleep()来调整异步时间比较,我的理解是异步操作还是等待的,只是同步的部分是并行的) //foreachy也是同理的 我们可以有一个不同的写法,这个需要我们注意到forEach的一个特性:对数组的每个元素执行一次提供的函数,那么我们可以这样写
UpdateClientCache(){
  console.log(new Date())
  let arrList = [1,2,3]
  let result = []
  
  arrList.forEach(async function(doc){
    result.push(await common.getLMXTableInfo(doc))
  })
  console.log(result)//当然是undefined
  console.log(new Date())
} //说明,这个应该是和上面的一样的,属于一种多异步并发的情况,因为forEach的每一次遍历都是重新提供一个函数的 相当于 let res1 = await common.getLMXTableInfo(1)     let res2 = await common.getLMXTableInfo(2)
    let res3 = await common.getLMXTableInfo(3)
    result.push()res1,res2,res3

  这个我按照ES6讲解的async中的例子做了测试,有些地方还不太清楚具体原因,有些没有重现出减少耗时的现象,所以有些地方还是做保留,大家可以按照这种思想做一下测试,自定义一个异步函数,给出一个回调函数,测试时间可以用new sleep()

来造成阻塞以便实现时间的测试,也可以用这个例子:

  

 var now = new Date();
var exitTime = now.getTime() + 4000;//具体时间可以改,ms为单位
while (true) {
now = new Date();
if (now.getTime() > exitTime){
break;
}
}
//就是一种前端等待的思想,可以包装成一个方法,参数是具体的毫秒

这个一个对ES6多个异步处理的并发继发思想的总结和理解的更多相关文章

  1. ES6 Generators的异步应用

    ES6 Generators系列: ES6 Generators基本概念 深入研究ES6 Generators ES6 Generators的异步应用 ES6 Generators并发 通过前面两篇文 ...

  2. ES6系列文章 异步神器async-await

    关于异步处理,ES5的回调使我们陷入地狱,ES6的Promise使我们脱离魔障,终于.ES7的async-await带我们走向光明.今天就来学习一下 async-await. async-await和 ...

  3. ES6 Promise 让异步函数顺序执行

    应用 ES6 的 内置对象 Promise, 让异步函数 按顺序执行的例子 如下: 上边 是四个用Promise 处理过的 异步执行的函数: fn1.fn2.fn3.fn4 下面,让其按顺序执行 如下 ...

  4. ES6 系列之异步处理实战

    前言 我们以查找指定目录下的最大文件为例,感受从 回调函数 -> Promise -> Generator -> Async 异步处理方式的改变. API 介绍 为了实现这个功能,我 ...

  5. js同步、异步、回调的执行顺序以及闭包的理解

    首先,记住同步第一.异步第二.回调最末的口诀 公式表达:同步=>异步=>回调 看一道经典的面试题: for (var i = 0; i < 5; i++) { setTimeout( ...

  6. GCD,用同步/异步函数,创建并发/串行队列

    队列  第一个参数:C语言字符串,标签 第二个参数: DISPATCH_QUEUE_CONCURRENT:并发队列 DISPATCH_QUEUE_SERIAL:串行队列 dispatch_queue_ ...

  7. 初步谈谈 C# 多线程、异步编程与并发服务器

    多线程与异步编程可以达到避免调用线程异步阻塞作用,但是两者还是有点不同. 多线程与异步编程的异同: 1.线程是cpu 调度资源和分配的基本单位,本质上是进程中的一段并发执行的代码. 2.线程编程的思维 ...

  8. FPGA设计中的异步复位、同步释放思想

    1.一个简单的异步复位例子: module test( input clk, input rst_n, input data_in, output reg out ); always@(posedge ...

  9. 消息/事件, 同步/异步/协程, 并发/并行 协程与状态机 ——从python asyncio引发的集中学习

    我比较笨,只看用await asyncio.sleep(x)实现的例子,看再多,也还是不会. 已经在unity3d里用过coroutine了,也知道是“你执行一下,主动让出权限:我执行一下,主动让出权 ...

随机推荐

  1. Docs-.NET-C#-指南-语言参考-预处理器指令:#pragma(C# 参考)

    ylbtech-Docs-.NET-C#-指南-语言参考-预处理器指令:#pragma(C# 参考) 1.返回顶部 1. #pragma(C# 参考) 2015/07/20 #pragma 为编译器给 ...

  2. Typescript 介绍和安装编译

    一. Typescript 介绍 1. TypeScript 是由微软开发的一款开源的编程语言. 2. TypeScript 是 Javascript 的超级,遵循最新的 ES6.Es5 规范.Typ ...

  3. matlab学习笔记2--matlab的帮助

    一起来学matlab-matlab学习笔记2--matlab的帮助 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用>张德丰等著 感谢张 ...

  4. ABAP函数篇1 日期函数

    1. 日期格式字段检查 data:l_date type ekko-bedat. l_date = '20080901'. CALL FUNCTION 'DATE_CHECK_PLAUSIBILITY ...

  5. Spring Cloud 如何使用Eureka注册服务 4.2.2

    要使用Eureka实现服务发现,需要项目中包含Eureka的服务端发现组件以及客户端发现组件. 搭建Maven父工程 创建一个Maven父工程xcservice-springcloud,并在工程的po ...

  6. CentOS8安装docker

    参考:https://www.cnblogs.com/ding2016/p/11592999.html 一,安装环境查看 二,下载docker-ce的repo curl https://downloa ...

  7. WebException 请求被中止: 操作超时

    HTTP 请求时出现 :WebException 请求被中止: 操作超时 处理HTTP请求的服务器 CPU 100% ,重启后正常.

  8. [计算机视觉][ARM-Linux开发]OpenCV 3.1下载 ippicv_linux_20151201失败

    安装OpenCV 3.1的过程中要下载ippicv_linux_20151201,由于网络的原因,这个文件经常会下载失败. 解决的办法是手动下载: 先下载 OpenCV 3.1 Download MD ...

  9. 高级UI-MD动画

    MD动画是谷歌推出的一种动画效果,其实现的效果能让用户看着很是舒服,符合MD动画的动画,有很强的用户交互体验 Touch Feedback(触摸反馈) 在触摸反馈这一块,用的最多的就是水波纹效果,而水 ...

  10. js删除json指定元素

    var obj = {‘id’:1, ‘name’:‘张三’}; delete obj.id; // 或者 delete obj[id];