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 ...
随机推荐
- JQuery基本知识汇总;JQuery常用方法;浅入了解JQuery
一.jQuery对象与JavaScript对象 ①JavaScript入口函数比jQuery入口函数执行的晚一些: JQuery的入口函数会等页面加载完成才执行,但是不会等待图片的加载: JavaSc ...
- c3p0死锁
1.APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks! 抛出以下异常信息: com.mchang ...
- React自己写的一个地图小组件
由于今天比较闲,就玩了玩react,然后就封装了一个地图的组件,当然功能比较简单,因为就是随手写的小东西,但是由于引用了百度API和bee-mobile,所以用起来可能要薛微麻烦一点点,但是我保证,只 ...
- 函数节流scroll,兼容火狐滚轮事件
//函数节流 var wheelTimeout; var wheelFun = function (func) { if (wheelTimeout) { return; } func(); whee ...
- Android滑动菜单使用(MenuDrawer和SlidingMenu)
项目地址: https://github.com/gokhanakkurt/android-menudrawer https://github.com/jfeinstein10/SlidingMe ...
- loadrunner11中文版破解文档+录制脚本(图/文)
下面是整理后的loadrunner11破解版的所有文件及操作步骤. LoadRunner11安装 1.Loadrunner11下载链接:https://pan.baidu.com/s/15Svt3kt ...
- python与MongoDB的基本交互:pymongo
本文内容: pymongo的使用: 安装模块 导入模块 连接mongod 获取\切换数据库 选择集合 CRUD操作 首发时间:2018-03-18 20:11 pymongo的使用: 安装模块: pi ...
- 获取元素的最终background-color
一.题目 用JS代码求出页面上一个元素的最终的background-color,不考虑IE浏览器,不考虑元素float情况.(题目copy自网上) 二.题目解析 1.考察底层JavaScript基 ...
- python第五十天--paramiko
python通过paramiko实现,ssh功能 import paramiko ssh =paramiko.SSHClient()#创建一个SSH连接对象 ssh.set_missing_host_ ...
- sleep和Sleep区别
windows Sleep 单位是毫秒 linux sleep 单位是秒