利用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 编写匿名函数的几种方法
Feb 21 Javascript
解决微信浏览器Javascript无法使用window.location.reload()刷新页面
Jun 21 Javascript
微信公众号-获取用户信息(网页授权获取)实现步骤
Oct 21 Javascript
Bootstrap table使用方法详细介绍
Dec 09 Javascript
Bootstrap标签页(Tab)插件使用方法
Mar 21 Javascript
js 获取今天以及过去日期
Apr 11 Javascript
微信小程序 监听手势滑动切换页面实例详解
Jun 15 Javascript
vue组件父子间通信详解(三)
Nov 07 Javascript
自定义PC微信扫码登录样式写法
Dec 12 Javascript
vue将对象新增的属性添加到检测序列的方法
Feb 24 Javascript
浅谈vuepress 踩坑记
Apr 18 Javascript
Element Collapse 折叠面板的使用方法
Jul 26 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中类的继承和用法实例分析
2016/05/24 PHP
php实现文件与16进制相互转换的方法示例
2017/02/16 PHP
yii2局部关闭(开启)csrf的验证的实例代码
2017/07/10 PHP
如何在Web页面上直接打开、编辑、创建Office文档
2007/03/12 Javascript
JQuery Tips(3) 关于$()包装集内元素的改变
2009/12/14 Javascript
jQueryPad 实用的jQuery测试工具(支持IE,chrome,FF)
2010/05/22 Javascript
js 上传图片预览问题
2010/12/06 Javascript
Jquery实现搜索框提示功能示例代码
2013/08/13 Javascript
JavaScript中的异常捕捉介绍
2014/12/31 Javascript
jQuery中replaceAll()方法用法实例
2015/01/16 Javascript
JavaScript获取网页表单action属性的方法
2015/04/02 Javascript
在JS方法中返回多个值的方法汇总
2015/05/20 Javascript
jquery实现根据浏览器窗口大小自动缩放图片的方法
2015/07/17 Javascript
js调出上下文菜单的实例
2015/12/17 Javascript
Hallo.js基于jQuery UI所见即所得的Web编辑器
2016/01/26 Javascript
JQuery组件基于Bootstrap的DropDownList(完整版)
2016/07/05 Javascript
JavaScript实现京东放大镜效果
2019/12/03 Javascript
如何实现iframe父子传参通信
2020/02/05 Javascript
[02:36]DOTA2英雄基础教程 帕格纳
2014/01/20 DOTA
[43:03]完美世界DOTA2联赛PWL S2 PXG vs Magma 第二场 11.21
2020/11/24 DOTA
python 基础教程之Map使用方法
2017/01/17 Python
Python利用递归实现文件的复制方法
2018/10/27 Python
Python 3.x基于Xml数据的Http请求方法
2018/12/28 Python
pip 安装库比较慢的解决方法(国内镜像)
2019/10/06 Python
tensorflow 2.1.0 安装与实战教程(CASIA FACE v5)
2020/06/30 Python
基于tensorflow __init__、build 和call的使用小结
2021/02/26 Python
Ibatis的核心配置文件都有什么
2014/09/08 面试题
简述synchronized和java.util.concurrent.locks.Lock的异同
2014/12/08 面试题
新闻发布会主持词
2014/03/28 职场文书
2015年简历自我评价范文
2015/03/11 职场文书
《日月潭》教学反思
2016/02/20 职场文书
Python激活Anaconda环境变量的详细步骤
2021/06/08 Python
一篇带你入门Java垃圾回收器
2021/06/16 Java/Android
SQL Server代理:理解SQL代理错误日志处理方法
2021/06/30 SQL Server
Win11 BitLocker 驱动器加密
2022/04/19 数码科技
浅谈Redis变慢的原因及排查方法
2022/06/21 Redis