这个一个对ES6多个异步处理的并发继发思想的总结和理解
1.首先我们需要理解的是js中for循环、forEach循环、map循环的一些差异性,直接说了为后面说到的提供一些依据
1.1 for循环最基本,也是最容易理解的。
1.2 forEach和map用法类似,
相同点:
都可以遍历到数组的每个元素,而且参数一致(数组中的当前项item,当前项的索引index,原始数组input)
不同点:
forEach() 方法对数组的每个元素执行一次提供的函数。总是返回undefined;
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多个异步处理的并发继发思想的总结和理解的更多相关文章
- ES6 Generators的异步应用
ES6 Generators系列: ES6 Generators基本概念 深入研究ES6 Generators ES6 Generators的异步应用 ES6 Generators并发 通过前面两篇文 ...
- ES6系列文章 异步神器async-await
关于异步处理,ES5的回调使我们陷入地狱,ES6的Promise使我们脱离魔障,终于.ES7的async-await带我们走向光明.今天就来学习一下 async-await. async-await和 ...
- ES6 Promise 让异步函数顺序执行
应用 ES6 的 内置对象 Promise, 让异步函数 按顺序执行的例子 如下: 上边 是四个用Promise 处理过的 异步执行的函数: fn1.fn2.fn3.fn4 下面,让其按顺序执行 如下 ...
- ES6 系列之异步处理实战
前言 我们以查找指定目录下的最大文件为例,感受从 回调函数 -> Promise -> Generator -> Async 异步处理方式的改变. API 介绍 为了实现这个功能,我 ...
- js同步、异步、回调的执行顺序以及闭包的理解
首先,记住同步第一.异步第二.回调最末的口诀 公式表达:同步=>异步=>回调 看一道经典的面试题: for (var i = 0; i < 5; i++) { setTimeout( ...
- GCD,用同步/异步函数,创建并发/串行队列
队列 第一个参数:C语言字符串,标签 第二个参数: DISPATCH_QUEUE_CONCURRENT:并发队列 DISPATCH_QUEUE_SERIAL:串行队列 dispatch_queue_ ...
- 初步谈谈 C# 多线程、异步编程与并发服务器
多线程与异步编程可以达到避免调用线程异步阻塞作用,但是两者还是有点不同. 多线程与异步编程的异同: 1.线程是cpu 调度资源和分配的基本单位,本质上是进程中的一段并发执行的代码. 2.线程编程的思维 ...
- FPGA设计中的异步复位、同步释放思想
1.一个简单的异步复位例子: module test( input clk, input rst_n, input data_in, output reg out ); always@(posedge ...
- 消息/事件, 同步/异步/协程, 并发/并行 协程与状态机 ——从python asyncio引发的集中学习
我比较笨,只看用await asyncio.sleep(x)实现的例子,看再多,也还是不会. 已经在unity3d里用过coroutine了,也知道是“你执行一下,主动让出权限:我执行一下,主动让出权 ...
随机推荐
- Dart介绍和环境搭建
/* Dart介绍: Dart是由谷歌开发的计算机编程语言,它可以被用于web.服务器.移动应用 和物联网等领域的开发. Dart诞生于2011年,号称要取代JavaScript.但是过去的几年中一直 ...
- 将C++资源文件读取出来
HRSRC hResource = FindResource(GetModuleHandle(NULL), MAKEINTRESOURCE(IDR_CALC), TEXT(&q ...
- Python - Django - Cookie 简单用法
home.html: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...
- 02点睛Spring4.1-Java Config
转载:https://www.iteye.com/blog/wiselyman-2210376 2.1 java config spring的java config主要使用@Configuration ...
- 微信API V3 RESTFUL
{"code":"SIGN_ERROR","message":"商户未设置加密的密钥,请登录商户平台操作!请参考http://kf ...
- 14、vue-pdf的使用
安装 npm install --save vue-pdf vue-pdf默认只显示第一页,可以写按钮翻页,也可以v-for多页显示 项目结构 实例一 按钮分页 <template> &l ...
- C罗是你人生中最好的健身教练和精神导师
C罗又进球了,两场小组赛包揽全队4粒进球,一己之力帮助葡萄牙取得1胜1平,掌握出线主动权.此前三届世界杯金靴分别只有6球.5球.5球进账,C罗如果能延续火爆状态,金靴唾手可得. 之前三届世界杯,C罗7 ...
- JIRA问题状态已关闭,但是解决结果还是未解决
自己设置的工作流,状态和解决结果是没有关联的,这时候我们要配置关联关系 1.如下,状态时已关闭,但是解决结果是未解决 . 2.解决方法: 2.1设置-问题-工作流,找到目前在使用的工作流,点击编辑 3 ...
- php cli传递参数的方法
php cli传递参数的方法 <pre>$options = "f:g:"; $opts = getopt( $options ); print_r($opts); & ...
- windows下大数据开发环境搭建(4)——Spark环境搭建
一.所需环境 · Java 8 · Python 2.6+ · Scala · Hadoop 2.7+ 二.Spark下载与解压 http://spark.apache.org/downloads.h ...