关于promise.all()的使用及说明

 更新时间:2023年04月25日 09:15:09   作者:微笑的鱼_  
这篇文章主要介绍了关于promise.all()的使用及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

关于promise.all()的使用

Promise.all可以将多个Promise实例包装成一个新的Promise实例。

同时,成功和失败的返回值是不同的,成功的时候返回的是一个结果数组,而失败的时候则返回最先被reject失败状态的值。

关键代码:将所有异步操作存储到数组pros中,Promise.all(pros)执行所有异步操作

let pros = []
data.forEach(element => {
    pros.push( this.getJsonFile(element.json,element.fileName) )
});
Promise.all(pros).then(val => {
    this.fontsList = [...val]
})

示例:

// 获取字体所有json文件展示
getIconFonts(isFresh) {
    req.post(window.context.uc+`/system/file/v1/queryIconFiles`).then(rep => {
        if(rep && rep.data) {
            // 将所有异步操作存储到数组pros中
            let pros = []
            data.forEach(element => {
                pros.push( this.getJsonFile(element.json,element.fileName) )
            });
            // 执行所有异步操作后处理数据
            Promise.all(pros).then(val => {
                this.fontsList = [...val]
                this.uploadFonts = [...this.fontsList]
            })
        }
    });
},
// 通过id获取json文件
getJsonFile(fileId, fileName) {
    return new Promise((resolve, reject) => {
        req.get(window.context.uc +'/system/file/v1/preview?fileId=' + fileId).then(rep => {
            if(rep && rep.data) {
                let data = {
                    fileName,
                    ...rep.data
                }
                // 返回处理后的数据
                resolve(data)
            }
        })
    })
}

Promise.all实现限制并发请求函数

Promise.all 的简单解释

// 当以下数组中promise1, promise2, promise3都resolve之后,触发promise.all的then函数。
Promise.all([promise1, promise2, promise3]).then((values) => {
  console.log(values);
});

需求解释

所谓并发请求,即有待请求接口100个,限制每次只能发出10个。即同一时刻最多有10个正在发送的请求。

每当10个之中有一个请求完成,则从待请求的接口中再取出一个发出。保证当前并发度仍旧为10。

直至最终请求完成。

设计思路

简单思路如下:(假设并发请求函数名字为limitedRequest)

  • 设定一个数组(命名为:pool),用于后续Promise.all的使用
  • 当limitedRequest被调用的时候,首先一次性发出10个请求,并放入到pool中
  • 每一个请求完成后的回调函数中继续触发下一个请求,而下一个请求返回Promise,他的回调函数继续绑定同样的回调函数,即循环调用。(看不懂就直接看代码更易懂)
  • 直到全部请求完成,停止。

代码实现

具体代码如下

// 模仿一个fetch的异步函数,返回promise
function mockFetch(param) {
  return new Promise((resovle) => {
    setTimeout(() => {
      resovle(param);
    }, 2000);
  });
}

function limitedRequest(urls, maxNum) {
  const pool = [];
  // 处理maxNum比urls.length 还要大的情况。
  const initSize = Math.min(urls.length, maxNum);
  for (let i = 0; i < initSize; i++) {
      // 一次性放入初始的个数
    pool.push(run(urls.splice(0, 1)));
  }
  // r 代表promise完成的resolve回调函数
  // r 函数无论什么样的结果都返回promise,来确保最终promise.all可以正确执行
  function r() {
    console.log('当前并发度:', pool.length);
    if (urls.length === 0) {
      console.log('并发请求已经全部发起');
      return Promise.resolve();
    }
    return run(urls.splice(0, 1));
  }
  // 调用一次请求
  function run(url) {
    return mockFetch(url).then(r);
  }
  // 全部请求完成的回调
  Promise.all(pool).then(() => {
    console.log('请求已经全部结束');
  });
}
// 函数调用
limitedRequest([1, 2, 3, 4, 5, 6, 7, 8], 3);

# 最终返回结果
$ node .\src\views\doc\detail\index.js
当前并发度: 3
当前并发度: 3
当前并发度: 3
当前并发度: 3
当前并发度: 3
当前并发度: 3
并发请求已经全部发起
当前并发度: 3
并发请求已经全部发起
当前并发度: 3
并发请求已经全部发起
请求已经全部结束

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • JS+jQuery实现注册信息的验证功能

    JS+jQuery实现注册信息的验证功能

    本文通过实例代码给大家分享了基于js+jquery实现的注册信息验证功能,代码简单易懂,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2017-09-09
  • 微信外唤起微信小程序的方法详解

    微信外唤起微信小程序的方法详解

    这篇文章主要介绍了微信外唤起微信小程序的方法,结合实例形式详细分析了微信外唤起微信小程序的相关步骤、原理与操作注意事项,需要的朋友可以参考下
    2023-07-07
  • javascript实现依次输入input自动定焦

    javascript实现依次输入input自动定焦

    这篇文章主要介绍了javascript实现依次输入input自动定焦的方法及示例代码,非常实用,这里推荐给小伙伴们
    2014-12-12
  • JavaScript中的null和undefined用法解析

    JavaScript中的null和undefined用法解析

    这篇文章主要介绍了JavaScript中的null和undefined用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • 微信小程序实现长按删除图片的示例

    微信小程序实现长按删除图片的示例

    本篇文章主要介绍了微信小程序实现长按删除图片的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • javascript每日必学之循环

    javascript每日必学之循环

    javascript每日必学之循环,本文的主要内容就是循环,死循环时进行bug调式,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • JS实现可视化文件上传

    JS实现可视化文件上传

    这篇文章主要为大家详细 介绍了JS实现可视化文件上传,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • JS实现十字坐标跟随鼠标效果

    JS实现十字坐标跟随鼠标效果

    这篇文章给大家分享一下通过JS实现十字坐标跟随鼠标效果的代码,有需要的朋友参考学习下吧。
    2017-12-12
  • wap图片滚动特效无css3元素纯js脚本编写

    wap图片滚动特效无css3元素纯js脚本编写

    手机图片滑动切换,网上有很多这样的例子,但都借助于其他组件,让代码混乱的不行,本例介绍的是无css3元素纯js脚本编写的wap图片滚动特效
    2014-08-08
  • 跨域浏览器设置解决前端跨域问题

    跨域浏览器设置解决前端跨域问题

    这篇文章主要为大家介绍了前端跨域浏览器设置解决前端跨域问题的方法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07

最新评论