内容简介:前几天看了作者
前几天看了作者 zz_jesse
的 写给新手前端的各种文件上传攻略,从小图片到大文件断点续传 ,学习了很多有关上传的知识点。但在大文件分片上传一块,作者有提及分片上传需要做并发限制处理,但他的demo并没有做。抱着学习的心态,我又去网上学习了一番。。
Promise.all()
Promise.all()
方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。
const p = Promise.all([p1, p2, p3]);
上面代码中, Promise.all()
方法接受一个数组作为参数,p1、p2、p3都是 Promise 实例,如果不是,就会先调用下面讲到的 Promise.resolve
方法,将参数转为 Promise 实例,再进一步处理。另外, Promise.all()
方法的参数可以不是数组,但必须具有 Iterator 接口,且返回的每个成员都是 Promise 实例。
p的状态由p1、p2、p3决定,分成两种情况。
(1)只有p1、p2、p3的状态都变成 fulfilled
,p的状态才会变成 fulfilled
,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。
(2)只要p1、p2、p3之中有一个被 rejected
,p的状态就变成 rejected
,此时第一个被 reject
的实例的返回值,会传递给p的回调函数。
Code
const requestsLimit = (list, limit, asyncHandle) => { return new Promise(resolve => { let _limit = limit; let recordList = []; // 记录异步操作 let index = 0; let listCopy = [].concat(list); let asyncList = []; // 正在进行的所有并发异步操作 const asyncFunc = () => { while(_limit--) { const data = listCopy.shift() if (data) asyncList.push(asyncHandle(data, index++)); } Promise.all(asyncList).then(response => { // 监听并记录每一次请求的结果 recordList = recordList.concat(response.filter(item => item)); if (listCopy.length !== 0) { _limit = limit; asyncList = []; asyncFunc() // 数组还未迭代完,递归继续进行迭代 } else { // 所有并发异步操作都完成后,本次并发控制迭代完成,返回记录结果 resolve(recordList) } }) } asyncFunc() }) } var dataLists = [1,2,3,4,5,6,7,8]; requestsLimit(dataLists, 3, (item, index) => { return new Promise(resolve => { // 执行异步处理 setTimeout(() => { // 筛选异步处理的结果 console.log(index) if (item % 2 === 0) resolve({ item, index }) else resolve() }, Math.random() * 5000) }); }).then(response => { console.log('finish', response) })
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 使用Akka实现并发
- 并发编程(十)—— Java 并发队列 BlockingQueue 实现之 SynchronousQueue源码分析
- 并发编程(九)—— Java 并发队列 BlockingQueue 实现之 LinkedBlockingQueue 源码分析
- 并发编程(八)—— Java 并发队列 BlockingQueue 实现之 ArrayBlockingQueue 源码分析
- java并发实战:连接池实现
- Golang实现简单爬虫框架(4)——队列实现并发任务调度
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
数据结构与算法分析(C++版)(第3版)
Clifford A. Shaffer / 张铭、刘晓丹、等译 / 电子工业出版社 / 2013 / 59.00元
本书采用当前流行的面向对象的C++程序设计语言来描述数据结构和算法, 因为C++语言是程序员最广泛使用的语言。因此, 程序员可以把本书中的许多算法直接应用于将来的实际项目中。尽管数据结构和算法在设计本质上还是很底层的东西, 并不像大型软件工程项目开发那样, 对面向对象方法具有直接的依赖性, 因此有人会认为并不需要采用高层次的面向对象技术来描述底层算法。 但是采用C++语言能更好地体现抽象数据类型的......一起来看看 《数据结构与算法分析(C++版)(第3版)》 这本书的介绍吧!