Promise,我们来实战
Promise的基础我就不说了,我更加关心的是Promise能带给我什么便利?这也是本文的内容所在。
Promise.all
并发执行多个异步方法,统一返回结果,结果按照参数的顺序返回。
const getRandom = () => +(Math.random()*1000).toFixed(0);
const asyncTask = taskID => new Promise(resolve => {
let timeout = getRandom();
console.log(`taskID=${taskID} start.`);
setTimeout(function() {
console.log(`taskID=${taskID} finished in time=${timeout}.`);
resolve(taskID)
}, timeout);
});
Promise.all([asyncTask(1),asyncTask(2),asyncTask(3)])
.then(resultList => {
console.log('results:',resultList);
});
上面的这个方法能够很好的看出Promise.all的执行方式,Promise.all的作用是显而易见的,比如我的页面上有多个请求,但是这些请求并没有任何联系,但是整个页面需要等这几个请求数据都获取到之后我们才能正确的展示页面,在之前一段时间里,我们可能会使用嵌套的方式去逐个请求,但考虑到这样会浪费时间,我们可能会优化自己的写法,通过计时器的方式去处理。其实计时器的原理跟Promise.all的实现的结果就差不多,而有了Promise.all之后就可以直接把几个异步的请求方法作为参数直接调用Promise.all了,so easy不是吗?
Promise.race
并发执行多个异步方法,返回最快的执行结果。
const getRandom = () => +(Math.random()*1000).toFixed(0);
const asyncTask = taskID => new Promise(resolve => {
let timeout = getRandom();
console.log(`taskID=${taskID} start.`);
setTimeout(function() {
console.log(`taskID=${taskID} finished in time=${timeout}.`);
resolve(taskID)
}, timeout);
});
Promise.race([asyncTask(1),asyncTask(2),asyncTask(3)])
.then(resultList => {
console.log('results:',resultList);
});
同样的这个例子也能很好的说明race的作用,race的作用,为了保障能够获取到数据,我们通过多个不同的方法去获取数据,但其实这几个方法返回的数据是相同的,只要任何一个方法成功返回了,我们就可以获取到自己想要的数据了。
看了上面两个例子之后是不是对Promise的作用更加了解了,其实前端业务开发中只要有了多个异步方法就可以使用Promise了,这也是目前最优雅的编码方式。尽量去用就对了,没毛病。
上面两种方法是Promise自带的,但是实际情况中有很多情况下,多个请求之间是有依赖关系的,所以我新增waterfall方法
Promise.waterfall
多个函数依次执行,且前一个的输出为后一个的输入。
实现如下面:
Promise.waterfall = function(promises){
if (!Array.isArray(promises)) {
throw new TypeError('You must pass an array to all.');
}
// 返回一个promise 实例
return new Promise(function(resolve, reject){
var i = 0,
result = [],
len = promises.length,
count = len;
// 每一个 promise 执行成功后,就会调用一次 resolve 函数
function resolver(index) {
return function(value) {
resolveWaterfall(index, value);
};
}
function rejecter(reason){
reject(reason);
}
function resolveWaterfall(index, value) {
if( index == len){
resolve(value)
} else {
promises[index](value).then(resolver(index + 1), rejecter);
}
}
resolveWaterfall(0);
});
};
同样的我们通过一段测试代码来看其执行结果
const getRandom = () => +(Math.random()*1000).toFixed(0);
const asyncTask = taskID => new Promise(resolve => {
taskID = taskID || 1;
let timeout = getRandom();
console.log(`taskID=${taskID} start.`);
setTimeout(function() {
console.log(`taskID=${taskID} finished in time=${timeout}.`);
resolve(taskID + 1)
}, timeout);
});
Promise.waterfall([asyncTask, asyncTask, asyncTask]).then(value => console.log(value))
返回的结果是4,三个异步方法依次执行,并且把前一次的输出作为下一次的输入执行。
Promise,我们来实战的更多相关文章
- Java多线程编程模式实战指南之Promise模式
Promise模式简介(转) Promise模式是一种异步编程模式 .它使得我们可以先开始一个任务的执行,并得到一个用于获取该任务执行结果的凭据对象,而不必等待该任务执行完毕就可以继续执行其他操作.等 ...
- Promise实战AJAX封装
一.利用Promise的知识,对最开始的ajax的例子进行一个简单的封装: var url = 'xxx'; // 封装一个get请求的方法 function request(url){ return ...
- 【C++并发实战】(三) std::future和std::promise
std::future和std::promise std::future std::future期待一个返回,从一个异步调用的角度来说,future更像是执行函数的返回值,C++标准库使用std::f ...
- 第八章 交互技术,8.4 Weex 双11会场大规模应用的秒开实战和稳定性保障(作者:鬼道)
8.4 Weex 双11会场大规模应用的秒开实战和稳定性保障 前言 Native 开发的诸多亮点中,流畅体验和系统调用是最多被提及的.流畅体验体现在页面滚动/动画的流畅性,背后是更好的内存管理和更接近 ...
- 细嗅Promise
读完这篇文章,预计会消耗你 40 分钟的时间. Ajax 出现的时候,刮来了一阵异步之风,现在 Nodejs 火爆,又一阵异步狂风刮了过来.需求是越来越苛刻,用户对性能的要求也是越来越高,随之而来的是 ...
- 关于promise(一)
该新特性属于 ECMAScript 2015(ES6)规范,在使用时请注意浏览器兼容性. 由于ES6原生提供Promise,所以无需安装Promise库.但在ES5环境下我们可以使用bluebird库 ...
- 微信小程序全面实战,架构设计 && 躲坑攻略(小程序入门捷径教程)
最近集中开发了两款微信小程序,分别是好奇心日历(每天一条辞典+一个小投票)和好奇心日报(轻量版),直接上图: Paste_Image.png 本文将结合具体的实战经验,主要介绍微信小程序的基础知识.开 ...
- Selenium2学习-007-WebUI自动化实战实例-005-解决 Firefox 版本不兼容:org.openqa.selenium.WebDriverException: Failed to connect to binary FirefoxBinary
此文主要讲述 Java 运行 Selenium 脚本时,因 Friefox 浏览器版本与 selenium-server-standalone-x.xx.x.jar 不兼容引起的 org.openqa ...
- [Javascript] Promise
Promise 代表着一个异步操作,这个异步操作现在尚未完成,但在将来某刻会被完成. Promise 有三种状态 pending : 初始的状态,尚未知道结果 fulfilled : 代表操作成功 r ...
随机推荐
- ubuntu17 安装中文输入法
在此说的是intelligent pinyin.我首先尝试的是搜狗输入法,虽然最终安装成功了,但还是直接卸载了.因为它不仅需要fcitx框架,在安装成功后,标题栏上面还会出现两个输入法图标.真正不能让 ...
- Mysql(六):数据备份、pymysql模块
一 IDE工具介绍 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具 下载链接:https://pan.baidu.com/s/1bpo5mqj 掌握: #1. 测试+链接 ...
- tf.variable和tf.get_Variable以及tf.name_scope和tf.variable_scope的区别
在训练深度网络时,为了减少需要训练参数的个数(比如具有simase结构的LSTM模型).或是多机多卡并行化训练大数据大模型(比如数据并行化)等情况时,往往需要共享变量.另外一方面是当一个深度学习模型变 ...
- Python实现二分查找
老生常谈的算法了. #!/usr/bin/python # -*- coding:utf-8 -*- # Filename: demo.py # 用python实现二分查找 def binarySea ...
- POJ - 2912 Rochambeau 种类并查集
题意:有三组小朋友在玩石头剪刀布,同一组的小朋友出的手势是一样的.这些小朋友中有一个是裁判,他可以随便出手势.现在给定一些小朋友的关系,问能否判断出裁判,如果能最早什么时候能够找到裁判. 思路:枚举每 ...
- 多线程编程学习笔记——异步调用WCF服务
接上文 多线程编程学习笔记——使用异步IO 接上文 多线程编程学习笔记——编写一个异步的HTTP服务器和客户端 接上文 多线程编程学习笔记——异步操作数据库 本示例描述了如何创建一个WCF服务,并宿主 ...
- MacOS App代码申请管理员权限
原文: https://jacobpan3g.github.io/cn/2018/02/07/gain-root-permission-for-mac-app/,有问题欢迎在原文评论区一起讨论交流,我 ...
- django框架 - 实时查看执行的sql语句
django框架采用的ORM模型,我们可以通过mysql的日志记录实时看到执行的sql语句,具体步骤如下: 第一步:找到mysql的配置文件 第二步:编辑mysql配置文件 第三步:重启mysql 第 ...
- Activiti 实战篇 小试牛刀
原文地址:http://blog.csdn.net/qq_30739519/article/details/51166062 1:工作流的概念 说明: 1) 假设:这两张图就是华谊兄弟的请假流程图 ...
- R语言︱用excel VBA把xlsx批量转化为csv格式
笔者寄语:批量读取目前看到有以下几种方法:xlsx包.RODBC包.批量转化成csv后读入.本章来自博客:http://www.cnblogs.com/weibaar/p/4506144.html 在 ...