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 sys 模块
import sys # 把命令行参数返回一个 List,第一个元素是程序本身的路径 print(sys.argv) # 命令行运行 python3 sys_model.py klvchen hell ...
- 《Attention is All You Need》浅读(简介+代码)
2017年中,有两篇类似同时也是笔者非常欣赏的论文,分别是FaceBook的<Convolutional Sequence to Sequence Learning>和Google的< ...
- MVC与单元测试实践之健身网站(五)-系统信息、前台入口
Fit项目停滞了一段时间,现在继续吧.上一篇完成了动作文本和配图的添加.编辑等内容.接下来要完成的是后台的最后一个模块:系统信息:以及前台的入口:关于注册.登录.修改密码等. 一 系统信息 a) 用户 ...
- Java虚拟机(一)结构原理与运行时数据区域
我们来学习Java虚拟机的结构原理与运行时数据区域. 1.Java虚拟机概述 Oracle官方定义的Java技术体系主要包括以下几个部分: Java程序设计语言 各种平台的Java虚拟机 Class文 ...
- [Android GMS 认证] keystore/keymaster/Attestation的问题
首先确定写入key,操作如下: 检查 /persist/data/sfs 目录下是否有key文件存在 adb shell ls -la /persist/data/sfs 做过key prov ...
- 软件工程-CMM与CMMI
CMM CMMI
- JMeter 脚本开发(五)
一.JMeter 元件运行顺序 执行顺序逻辑如下: 1.配置元件(如果存在) 2.前置处理器(如果存在) 3.定时器(如果存在) 4.取样器(如果存在) 5.后置处理器(如果存在且取样器的结果不为空) ...
- MySQL复制ERROR 1794 (HY000): Slave is not configured or failed to initialize properly.
ERROR 1794 (HY000): Slave is not configured or failed to initialize properly. You must at least set ...
- 使用 WebStorm IDE 调试 Pomelo 应用程序
使用得心应手的IDE来开发应用程序,可以使我们的工作事半功倍.而调试则更可以让我们准确的定位BUG,发现问题.本文讲述如何使用 WebStorm 这个怪兽级JavaScript IDE来调试 Chat ...
- VSCode + PYQT5 + QtDesigner 环境搭建和测试
目的:编写Python桌面应用程序. 备注:也可以选择VS2017+QtDesigner ,但更喜欢VSCode 第1步:安装PyQt5和PyQt5-tools pip3 install -i htt ...