这个一个对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了,也知道是“你执行一下,主动让出权限:我执行一下,主动让出权 ...
随机推荐
- npm使用国内源
npm使用国内源 转 https://www.jianshu.com/p/7e84d7b119bc $ npm install -g cnpm --registry=https://registr ...
- 004-行为型-06-命令模式(Command)
一.概述 是一种数据驱动的设计模式 请求以命令的形式包裹在对象中,并传给调用对象.调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令. 将请求封装成对象,以便使用不同的请 ...
- 算法习题---5-8图书管理系统*****<双向迭代器>(UVa230)
一:题目 就是输入一系列书本名和作者名,然后输入命令模拟借书和还书,再输出归还的书的摆放位置.要求有两点: 需要对归还的书做特殊排序处理:作者名相同,则书本按书名从小到大排序:否则书本按作者名大小排序 ...
- oracle数据库【表复制】insert into select from跟create table as select * from 两种表复制语句区别
create table as select * from和insert into select from两种表复制语句区别 create table targer_table as select ...
- LeetCode_342. Power of Four
342. Power of Four Easy Given an integer (signed 32 bits), write a function to check whether it is a ...
- redis和memcache对比
1.性能方面:没有必要过多的关心性能,因为二者的性能都已经足够高了.由于Redis只使用单核,而Memcached可以使用多核,所以在比较上,平均每一个核上Redis在存储小数据时比Memcached ...
- 修改config中的assemblyBinding
修改config中的assemblyBinding 未测试这段代码 private void SetRuntimeBinding(string path, string value) { XmlDoc ...
- stochastic noise and deterministic noise
在机器学习中,导致overfitting的原因之一是noise,这个noise可以分为两种,即stochastic noise,随机噪声来自数据产生过程,比如测量误差等,和deterministic ...
- GATK4注意事项
近期在测试多样品的WES的过程中发现用HC得到gvcf之后,合并多个样品的gvcf文件的过程中,使用CombineGVCFs的过程中很慢,发现官网推荐使用GenomicsDBImport 用法如下: ...
- LeetCode 53. 最大子序和(Maximum Subarray)
53. 最大子序和 53. Maximum Subarray 题目描述 给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. LeetCode53. M ...