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. 异常检测-基于孤立森林算法Isolation-based Anomaly Detection-1-论文学习

    论文http://202.119.32.195/cache/10/03/cs.nju.edu.cn/da2d9bef3c4fd7d2d8c33947231d9708/tkdd11.pdf 1. INT ...

  2. Web Service 和 WCF的比较

    Web Service 和WCF的比较 Web Service 的工作原理 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intra ...

  3. 【翻译】Flink 异步I / O访问外部数据

    本文来自官网翻译: Asynchronous I/O for External Data Access 需要异步I / O操作 先决条件 异步I / O API 超时处理 结果顺序 活动时间 容错保证 ...

  4. Swift 4.0 + Ipad开发项目中值得注意知识点

    1.注意Xib的约束和代码的约束,注意适配问题: 2.设置view的frame可以使用view.frame.maxX实现布局: 3.UIStackView在xib中的使用,可以很好的实现约束,布局和屏 ...

  5. NPOI OFFICE 2007 文件格式不被支持,读取异常

    在使用public XSSFWorkbook(FileInfo file) 时报文件格式不被支持,(读取异常/格式错误),根目录少了 ICSharpCode.SharpZipLib.dll . NPO ...

  6. git的使用学习(二)git的操作使用

    1.创建版本库 什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改.删除,Git都能跟踪,以便任何时刻都 ...

  7. mongodb4.0 安装

    下载: wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.9.tgz 解压缩 tar -zxvf mongodb-linux ...

  8. Django中cookie和session的操作

    一.cookie和session cookie:在网站中,http请求是无状态的.也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户.cookie的出现就是 ...

  9. js 常用操作 -- 持续更新

    替换数组中某一元素: array.splice(2, 1, '哈哈'); // 2 表示指定数组中2下标元素,1表示要删除的项数,哈哈 是替换后的值 在数组中某元素之前增加元素: array.spli ...

  10. Java网络编程探究|乐字节

    大家好,我是乐字节小乐,上次给大家讲述了Java中的IO流之输出流|乐字节,本文将会给大家讲述网络编程. 主要内容如下: 网络 网络分层 IP位置 端口port 网络编程 一. 网络 1.概念 网络即 ...