利用ES6的Promise.all实现至少请求多长时间的实例


Posted in Javascript onAugust 28, 2017

1、背景

我们都知道ajax请求可以加个timeout,就是最多请求多少时间,如果超过这个时间直接就报错。 这个是最多请求多长时间,我现在要做的是,最少要请求多长时间,然后才能执行后续的逻辑。

比如,一个ajax请求 x 毫秒就执行完毕了,但我要让他至少执行1秒钟,那我们会这么想: ajax完成后 , 1. 如果x<1s, 那我们先setTimeout => 1s - x ,然后执行后续操作。 2 如果x>=1s, 那我们直接执行后续操作。 想想这可繁琐了,我们还要在前面记录一下开始时间,后面记录一下结束时间,然后才能得到x。。。。

或者变量flag,ajax里面完成设置flag,setTimeout里面完成也设置flag等等等方法,都很繁琐、

2、Solution

现在ES6有个Promise.all,非常适合解决此类问题。直接这样 Promise.all([ajaxPromise(), waitPromise(1s)]).then(()=> 至少执行了1s) 。。。

如果说是 多个ajax(promise)按顺序执行,但总共加起来的时间至少是1s呢? 那就用一个Promise把多个ajax包起来。然后 Promise.all([ajaxPromiseAll(), waitPromise(1s)]).then(()=> 至少执行了1s) 。。。

3、 讲得很抽象,实例为证

这个实例是这样的,微信里面有拆红包,当我们点击 ? 的时候,那个字至少会完整的 翻一翻。那个完整翻一翻的时间我们假定需要1秒钟。 如果我们直接点击开的时候,立即请求ajax,等ajax完成立即拆开红包,这里的时间 有可能不足1s,那 就不能做到完整翻一翻。 如果请求大于1s,那就让它一直翻转吧,直到完成请求。所以我们为了解决这个问题,就需要用到上面的技术。

参考代码如下(Chrome最新版下测试):

/ ajax模拟A
const funcA = async () =>
 new Promise(resovel => {
  setTimeout(() => {
   console.log("done A");
   resovel("func A");
  }, 400);
 });

因为async和await使用起来比Promise爽,所以我采用了这两个语法糖来写,用setTimeout来模拟ajax请求, ajax模拟A和 ajax模拟B有顺序关系的,比如先检测这个人是否还有机会打开红包,然后再请求打开红包获得随机红包金额 。

以上这篇利用ES6的Promise.all实现至少请求多长时间的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript QueryString解析类代码
Jan 17 Javascript
菜鸟学习JavaScript小实验之函数引用
Nov 17 Javascript
基于jquery的跨域调用文件
Nov 19 Javascript
一个挺有意思的Javascript小问题说明
Sep 26 Javascript
文本框中禁止非数字字符输入比如手机号码、邮编
Aug 19 Javascript
javascript二维数组转置实例
Jan 22 Javascript
jQuery实现悬浮在右上角的网页客服效果代码
Oct 24 Javascript
javascript动画之模拟拖拽效果篇
Sep 26 Javascript
微信小程序-小说阅读小程序实例(demo)
Jan 12 Javascript
JS实现动态添加DOM节点和事件的方法示例
Apr 28 Javascript
浅谈Vue数据响应思路之数组
Nov 06 Javascript
详解微信小程序用定时器实现倒计时效果
Apr 30 Javascript
JS自定义函数实现时间戳转换成date的方法示例
Aug 27 #Javascript
JavaScript学习笔记之惰性函数示例详解
Aug 27 #Javascript
Vue实现typeahead组件功能(非常靠谱)
Aug 26 #Javascript
vue下跨域设置的相关介绍
Aug 26 #Javascript
客户端(vue框架)与服务器(koa框架)通信及服务器跨域配置详解
Aug 26 #Javascript
微信小程序实现顶部普通选项卡效果(非swiper)
Jun 19 #Javascript
微信小程序实现顶部选项卡(swiper)
Jun 19 #Javascript
You might like
php中$美元符号与Zen Coding冲突问题解决方法分享
2014/05/28 PHP
php实现singleton()单例模式实例
2014/11/06 PHP
PHP中md5()函数的用法讲解
2019/03/30 PHP
详解php反序列化
2020/06/10 PHP
非常漂亮的JS代码经典广告
2007/10/21 Javascript
JQUERY CHECKBOX全选,取消全选,反选方法三
2008/08/30 Javascript
xml分页+ajax请求数据源+dom取结果实例代码
2008/10/31 Javascript
给jqGrid数据行添加修改和删除操作链接(之一)
2011/11/04 Javascript
让图片旋转任意角度及JQuery插件使用介绍
2013/03/20 Javascript
JavaScript常用全局属性与方法记录积累
2013/07/03 Javascript
javascript实现的元素拖动函数宿主为浏览器
2014/07/21 Javascript
JavaScript替换当前页面的方法
2015/04/03 Javascript
学习JavaScript正则表达式
2015/11/13 Javascript
web前端vue filter 过滤器
2018/01/12 Javascript
Angular7中创建组件/自定义指令/管道的方法实例详解
2019/04/02 Javascript
微信小程序如何调用图片接口API并居中显示
2019/06/29 Javascript
js实现星星海特效的示例
2020/09/28 Javascript
基于JQuery和DWR实现异步数据传递
2020/10/16 jQuery
[01:44]Ti10举办地公布
2019/08/25 DOTA
深入理解NumPy简明教程---数组3(组合)
2016/12/17 Python
python读取文件名称生成list的方法
2018/04/27 Python
python将字符串以utf-8格式保存在txt文件中的方法
2018/10/30 Python
Python读取excel指定列生成指定sql脚本的方法
2018/11/28 Python
Python设计模式之简单工厂模式实例详解
2019/01/22 Python
python sklearn库实现简单逻辑回归的实例代码
2019/07/01 Python
python multiprocessing模块用法及原理介绍
2019/08/20 Python
Python中__repr__和__str__区别详解
2019/11/07 Python
Python 通过爬虫实现GitHub网页的模拟登录的示例代码
2020/08/17 Python
Oral-B荷兰:牙医最推荐的品牌
2020/02/25 全球购物
演讲稿格式
2014/04/30 职场文书
建筑安全生产责任书
2014/07/22 职场文书
2015年学校远程教育工作总结
2015/07/20 职场文书
靠谱的活动总结
2019/04/16 职场文书
Go语言切片前或中间插入项与内置copy()函数详解
2021/04/27 Golang
一起来学习Python的元组和列表
2022/03/13 Python
Rust中的Struct使用示例详解
2022/08/14 Javascript