首页 > 其他分享 >第十二篇 手写原理代码 - 实现一个前端并发控制请求函数

第十二篇 手写原理代码 - 实现一个前端并发控制请求函数

时间:2023-04-12 12:11:48浏览次数:46  
标签:第十二 http 请求 results 并发 urls const 手写

实现并发控制请求函数

/**
 * 并发控制请求函数
 * @param {Array} urls 请求的 URL 数组
 * @param {Number} max 最大并发数
 * @param {Function} callback 请求成功回调函数
 */
async function concurrentRequest(urls, max, callback) {
  const len = urls.length;
  // 用一个数组存储所有的请求结果
  const results = new Array(len);
  // 用一个变量记录已经完成的请求数
  let count = 0;

  // 定义一个请求函数,返回一个 Promise 对象
  function request(url) {
    return new Promise((resolve, reject) => {
      fetch(url)
        .then((res) => res.json())
        .then((data) => {
          resolve(data);
        })
        .catch((err) => {
          reject(err);
        });
    });
  }

  // 利用 while 循环来模拟并发请求过程
  while (count < len) {
    // 判断当前并发数是否已达到最大值,如果未达到则继续发起新的请求
    if (count < max) {
      const index = count;
      count++;
      const url = urls[index];
      try {
        // 调用请求函数并保存请求结果
        const result = await request(url);
        results[index] = result;
        callback && callback(result);
      } catch (err) {
        console.error(`Error occurred when fetching ${url}:`, err);
      }
    } else {
      // 如果当前并发数已经达到最大值,就等待其中的一个请求完成后再继续发起新的请求
      await Promise.race(results.map((p) => p instanceof Promise && p.catch(() => {})));
    }
  }
  return results;
}

使用

const urls = [
  "http://xxa",
  "http://xxb",
  "http://xxc",
  "http://xxd",
  "http://xxe",
  "http://xx1e",
  "http://xx2e",
  "http://xx3e",
  "http://x4xe",
]

// 定义最大并发数
const maxConcurrent = 3;

// 调用 concurrentRequest 函数进行并发控制请求
concurrentRequest(urls, maxConcurrent, (result) => {
  console.log(result);
}).then((results) => {
  console.log('All requests have been completed:', results);
});

标签:第十二,http,请求,results,并发,urls,const,手写
From: https://www.cnblogs.com/caix-1987/p/17309377.html

相关文章

  • 第十三篇 手写原理代码 - 实现 Promise
    当使用JavaScript进行异步编程时,我们往往需要面对回调地狱(callbackhell)、代码可读性低、错误处理困难等问题。为了解决这些问题,ECMAScript6(ES6)中引入了Promise。Promise是一种用于处理异步操作的对象,它是一个容器,保存着未来才会结束的事件(通常是一个异步操作),并提供了一组......
  • 第十一篇 手写原理代码 - 实现事件订阅中类
    javaScript中的订阅发布模式(也称为观察者模式)是一种设计模式,用于在对象之间的事件通信中。该模式由两部分构成:发布者和订阅者。发布者持有所有订阅者的引用,在某个事件发生时通知所有的订阅者,从而触发它们的相应行为。这种模式可以用于解耦发布者和订阅者之间的依赖关系,从而实......
  • 手写防抖节流函数
    防抖函数functiondebounce(fn,t){  lettimeId  returnfunction(){//如果有定时器就清除  if(timeId)clearTimeout(timeId)//开启定时器200  timeId=setTimeout(function(){   fn()  },t) }}//节流函数throttlefunctionth......
  • [shell] git并发提交
     for((i=1;i<5;i++))dosed-i"s/:$app_name:.*/:$app_name:$app_tag/"$app_filegitadd$app_filegitconfiguser.emailyourname@email.comgitconfiguser.nameyournamegitcommit-m"$app_branch$app_name:$app_tag&q......
  • 手写一个深拷贝
    functiondeepClone(obj){if(typeofobj!='object')returnobject//1、建立新容器vartemp=array.isArray(obj)?[]:{}//2、通过遍历将原有数组的值循环出来放到新建立的容器上for(letkeyinobj){if(obj.hasOwnProper......
  • 第二篇 手写原理代码 - 函数【 函数防抖 、函数节流 】
    函数防抖和函数节流都是优化高频事件处理的JavaScript技术。它们可以限制函数的调用,在一定程度上减少计算、网络请求和提高响应速度,但它们的实现方式略有不同函数防抖:延迟执行函数,只有在事件停止后才会执行最后一次事件函数节流:定期执行函数,每隔一段时间执行一次通常情况下,......
  • 第四篇 手写原理代码 - 函数 【 实现 compose 函数 】
    JavaScript中的Compose函数用于组合一些函数,使得每个函数都接收上一个函数的返回值作为参数,并返回一个新的函数。可以使用这种方式把多个函数串起来,从而实现更复杂的逻辑Comopse函数是一个非常有用的工具,它可以帮助我们简化程序逻辑,实现代码复用,提高开发效率实现compose......
  • 第六篇 手写原理代码 - 对象 【 实现 AJAX 请求 】
    AJAX是AsynchronousJavaScriptandXML的缩写,指的是通过JavaScript和XML技术在不重新加载整个页面的情况下,实现与服务器之间异步通信的技术。使用AJAX技术能够使网页更加动态和用户友好。JavaScript的AJAX技术借助于浏览器内置的XMLHttpRequest对象实现。XMLHttp......
  • 第五篇 手写原理代码 - 对象 【 实现 new 过程、实现 instanceof 】
    在JavaScript中,new关键字用于创建一个对象实例,它通常与构造函数一起使用。当使用new关键字时,会发生以下几件事情:1、创建一个新对象,并将该对象的属性设置为构造函数的原型(即__proto__)2、将构造函数的作用域绑定到新对象上,并执行构造函数中的代码3、如果构造函数返......
  • 第七篇 手写原理代码 - 对象 【 实现对象的深度拷贝、实现对象的深度对比 】
    在JavaScript中,对象拷贝可以分为浅拷贝和深拷贝两种方式1、浅拷贝浅拷贝只是复制了对象的引用地址,新对象的属性与原对象的属性指向同一块内存地址2、深拷贝深拷贝会完整地复制对象以及其内部所有嵌套对象使用JSON.parse(JSON.stringify())方法进行深拷贝......