parallel方法 异步并行执行
Promise提供了all方法, 但是状态只有2种,
第一种是所有promise实例都成功则返回值组成一个数组,传递给p的回调函数;
第二种是有一个实例被rejected,状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。
问题:其实我想要所有异步的结果,不管成功与否,然后根据结果遍历做相应的事, 下面方法就是这么产生的。
/**
* 并行执行异步,每个异步不管成功与否,都把结果放入result中,作为回调的第一个参数
* @param {[type]} arr [arr数组中全都是promise实例]
* @param {Function} callback [等所有异步完成后的回调 result是结果,作为其第一个参数]
*/
var parallel = function (arr, callback) {
if (Array.isArray(arr)) {
let times = arr.length;
let done = _after(times, callback);
for (let i = 0; i <= times - 1; i ++) {
let p = (arr[i] instanceof Promise) ? arr[i] : Promise.resolve(arr[i]);
p.then(function(result) {
done(String(i+1), result);
}).catch(function(reason) {
done(String(i+1), reason);
});
};
} else {
console.error(`必须是数组,数组元素均为Promise实例`);
}; function _after(times, callback) {
let count = 0, result = {}; return function(key, value) {
result[key] = value;
count ++;
if (count === times) {
callback && callback(result);
};
};
};
};
// 使用/测试
function a() {
return 'a';
} function b() {
return new Promise(function(resolve, reject) {
setTimeout(()=> {
resolve('b');
}, 4000);
});
}; function c() {
return new Promise(function(resolve, reject) {
setTimeout(()=> {
resolve('c');
}, 2000);
});
}; var promises = [a(), b(), c()];
console.time('lab');
parallel(promises, function(result) {
console.log(result);
console.timeEnd('lab');
});
parallel方法 异步并行执行的更多相关文章
- 使用getScript()方法异步加载并执行js文件
使用getScript()方法异步加载并执行js文件 使用getScript()方法异步请求并执行服务器中的JavaScript格式的文件,它的调用格式如下所示: jQuery.getScript(u ...
- 使用getJSON()方法异步加载JSON格式数据
使用getJSON()方法异步加载JSON格式数据 使用getJSON()方法可以通过Ajax异步请求的方式,获取服务器中的数组,并对获取的数据进行解析,显示在页面中,它的调用格式为: jQuery. ...
- 使用load()方法异步请求数据
使用load()方法通过Ajax请求加载服务器中的数据,并把返回的数据放置到指定的元素中,它的调用格式为: load(url,[data],[callback]) 参数url为加载服务器地址,可选项d ...
- Spring开启方法异步执行
@EnableAsync @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Import(Async ...
- AOP +FreeSql 跨方法异步事务
AOP +FreeSql 跨方法异步事务 Autofac.Extensions.DependencyInjection Autofac.Extras.DynamicProxy Castle.Core. ...
- 深入了解C#(TPL)之Parallel.ForEach异步
前言 最近在做项目过程中使用到了如题并行方法,当时还是有点犹豫不决,因为平常使用不多, 于是借助周末时间稍微深入了下,发现我用错了,故此做一详细记录,希望对也不是很了解的童鞋在看到本文此文后不要再犯和 ...
- VB.NET中使用代表对方法异步调用
按照我们常规的思维方式,计算机应该是干完一件事,然后再干下一件.用术语来说,这种执行任务的方式叫做同步执行(Synchronous Execution).既然这样,那么为什么要引入异步执行的概念呢? ...
- 微信小程序中使用Async-await方法异步请求变为同步请求
微信小程序中有些 Api 是异步的,无法直接进行同步处理.例如:wx.request.wx.showToast.wx.showLoading等.如果需要同步处理,可以使用如下方法: 注意: Async ...
- Task/Parallel实现异步多线程
代码: #region Task 异步多线程,Task是基于ThreadPool实现的 { //TestClass testClass = new TestClass(); //Action<o ...
随机推荐
- Python全栈学习_day005知识点
今日内容大纲: . 字典的增删改查以及其他操作 . 字典的嵌套 . 字典的增删改查以及其他操作 , 'sex': '男'}, 'name_list': ['无双', 'alex', 'BlameK'] ...
- canvas-star4.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Python 练习:使用 * 输出直角三角形
正方向 height = int(input("please input height: ")) tmp = 1 while tmp <= height: width = t ...
- csharp:FTP Client Library using FtpWebRequest or Sockets
https://netftp.codeplex.com/SourceControl/latest http://ftplib.codeplex.com/ https://www.codeproject ...
- RxJava2.0的使用详解
RxJava2.0的使用详解 1,初识RxJava RxJava就是一种用Java语言实现的响应式编程,来创建基于事件的异步程序 RxJava是一个基于事件订阅的异步执行的一个类库,目前比较火的一些技 ...
- 利用朴素贝叶斯分类算法对搜狐新闻进行分类(python)
数据来源 https://www.sogou.com/labs/resource/cs.php介绍:来自搜狐新闻2012年6月—7月期间国内,国际,体育,社会,娱乐等18个频道的新闻数据,提供URL ...
- CGI,FastCGI,PHP-FPM,PHP-CLI,modPHP
This might give you a broader understanding of their difference: CGI: (common gateway interface) It ...
- pyhthon常用模块hashlib
python hashlib模块 一,hashlib模块主要用于加密,其中提供sha1,sha224,sha256,sha384,sha512,md5算法.常用的使用md5即可完成需求. 一,使用md ...
- C语言四舍五入
//今天遇到了四舍五入的问题,这些问题如果不看别人的真的难想出这么巧妙的方法啊.努力积累,早日成为大佬. int i = (int)(a + 0.5) ////小数部分大于0.4,加上0.5就会超过整 ...
- 04LaTeX学习系列之---overleafz在线编辑平台的使用
目录 目录 前言 (一)overleaf的认识 1.由来: 2.优点: 3.界面: (二)编译与查看 1.选择编译器 2.编译 (三)基本的设置与操作 1.基本设置 2.基本操作 目录 本系列是有关L ...