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

一、背景

咱们都知道ajax请求能够加个timeout,就是最多请求多少时间,若是超过这个时间直接就报错。 这个是最多请求多长时间,我如今要作的是,最少要请求多长时间,而后才能执行后续的逻辑。ajax

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

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

二、Solution

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

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

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

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

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

See the Pen Promise.all的应用实例 by wenjie (@wenjie) on CodePen.hash

由于async和await使用起来比Promise爽,因此我采用了这两个语法糖来写,用setTimeout来模拟ajax请求, ajax模拟A和 ajax模拟B有顺序关系的,好比先检测这我的是否还有机会打开红包,而后再请求打开红包得到随机红包金额 。it

相关文章
相关标签/搜索