js控制并发请求的最优解和js控制调用频率,大量请求延迟执行

js控制并发请求的最优解

思路:维护一个运行池,一个等待队列,出一个进一个,控制运行池的大小

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>并发请求示例</title>
</head>
<body><script>// 模拟请求const requestFn = () => {return new Promise((resolve) => {setTimeout(() => {resolve(true)}, 50);})}const urlList = new Array(100).fill(requestFn)const poll = new Set();const waitQueue = [];const request = url => {return new Promise((res, rej) => {const isFull = poll.size >= 10;const fn = function fn(){// const request = fetch(url);const request = url();request.finally(() => {poll.delete(fn);const next = waitQueue.shift();next && poll.add(next);setTimeout(() => next?.())})request.then(res)request.catch(rej)return request;}if (isFull) {waitQueue.push(fn)} else {poll.add(fn);fn();}})}for(let [index, url] of urlList.entries()) {request(url).then(() => console.log("====", index))}</script>
</body>
</html>

控制调用频率

工作中还有一种情况,非并发,是控制调用api的频率
需求: 数据库中存的2000多条地图经纬度数据有的不准确,所以想把所有的数据都重新获取重新刷一下,控制下调用百度地图api 的频率,每100毫秒调用一次,然后提交给接口进行保存。
实现方式: 使用setTimeout实现,延迟100毫秒 * index 执行【如果大家有其他实现方式请提供下,谢谢】

  import waitData from './waitData.json';  // 所有待执行的数据,2000多条数据let waitSaveData: any = [];let successData: any = [];let waitSaveErrInfo: any = [];// 保存失败的数据文件,不含失败信息,方便再次尝试执行function saveErrToFile() {const blob = new Blob([JSON.stringify({ result: { records: waitSaveData } })], { type: 'text/plain' });const link = document.createElement('a');link.href = URL.createObjectURL(blob);link.download = 'data.json';link.click();URL.revokeObjectURL(link.href);}// 保存失败的数据文件,含失败信息function saveErrInfoToFile() {const blob = new Blob([JSON.stringify(waitSaveErrInfo)], { type: 'text/plain' });const link = document.createElement('a');link.href = URL.createObjectURL(blob);link.download = 'err.json';link.click();URL.revokeObjectURL(link.href);}// 保存成功的数据文件function saveSuccessToFile() {const blob = new Blob([JSON.stringify(successData)], { type: 'text/plain' });const link = document.createElement('a');link.href = URL.createObjectURL(blob);link.download = 'err.json';link.click();URL.revokeObjectURL(link.href);}// 刷新数据方法
const refreshInfo = () => {waitSaveData = [];successData = [];waitSaveErrInfo = [];console.log('✨开始刷新数据✨', waitData.result.records);const allDataLength = waitData.result.records.length;waitData.result.records.forEach((item, index) => {var bdary = new BMap.Boundary(); // 百度地图api,通过城市获取行政区域的经纬度数据setTimeout(() => { // 定时器,延迟100毫秒 * index 执行bdary.get(item.putGoodsPlace, function (rs) {var count = rs.boundaries.length; //行政区域的点有多少个if (count === 0) { // 获取失败,保存失败数据console.info(item.putGoodsPlace + '未能获取当前输入行政区域');waitSaveData.push(item);waitSaveErrInfo.push({ ...item, err: '未能获取当前输入行政区域' });return;}var boundLngLat = JSON.stringify(rs.boundaries);var lngLat = '';for (var i = 0; i < count; i++) {lngLat += rs.boundaries[i] + ';';}lngLat = lngLat.substring(0, lngLat.length - 1);// 要提交接口的数据const data = {lngLat,boundLngLat,type: '1',figureType: '1',targetPlaceCode: item.targetPlaceCode,targetPlaceName: item.targetPlaceNameCp,enclosureName: item.enclosureName,putGoodsPlace: item.putGoodsPlace,warehouseName: item.warehouseName,longLatCode: item.longLatCode,};saveData(data).then(() => {successData.push(item);}).catch((err) => {console.log('✨file:index.vue:211✨✨', err.message);waitSaveData.push(item);waitSaveErrInfo.push({ data: { ...data, lngLat: '请查看请求', boundLngLat: '请查看请求' }, err: err.message });});// 打印索引,方便查看执行进度if (index % 50 === 0) {console.log('当前索引', index);}if (index === allDataLength - 1) {console.log('✨执行完毕✨', index);}});}, 100 * index);});};

waitData.json 文件格式如下:

{success: true,message: '操作成功',code: 200,result: {records: [{longLatCode: 'BWL000000002058863',enclosureName: '广东省韶关市南雄市',putGoodsPlace: '广东省韶关市南雄市',type: '1',isUser: '1',warehouseName: '',radius: '',figureType: '1',targetPlaceCode: '440000,440200,440200',targetPlaceNameCp: '广东省,韶关市,南雄市',},{longLatCode: 'BWL000000002058511',enclosureName: '辽宁省沈阳市法库县',putGoodsPlace: '辽宁省沈阳市法库县',type: '1',isUser: '1',warehouseName: '',radius: '',figureType: '1',targetPlaceCode: '210000,210100,210100',targetPlaceNameCp: '辽宁省,沈阳市,法库县',},],},};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/847595.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入探讨:Kubernetes 与低代码的原理及应用实战

随着云计算技术的飞速发展&#xff0c;云原生技术逐渐成为企业数字化转型的重要支撑。其中&#xff0c;Kubernetes和低代码作为云原生的两大关键技术&#xff0c;不仅为企业提供了灵活高效的IT解决方案&#xff0c;更助力企业快速响应市场变化&#xff0c;提升竞争力。本文将详…

webSecurity安全

0x01 简介 https://www.electronjs.org/zh/docs/latest/tutorial/security#6-%E4%B8%8D%E8%A6%81%E7%A6%81%E7%94%A8-websecurity 大家好&#xff0c;今天跟大家讨论的是 Electron 的安全配置选项 —— webSecurity 这在之前的文章 《Electron安全与你我息息相关》 中就已经提…

C# 解决 Excel 自动适应列宽的问题

目录 问题现象 原因分析 范例运行环境 解决问题 生成测试文本 实现自适应 小结 问题现象 通过 COM 操作 Excel 自动适应列宽的方法是 AutoFit 方法&#xff0c;该方法适于自动适应列宽或行高。 最近在我们的一款应用里发现效果并没有符合预期&#xff0c;我们提供了一…

【调试笔记-20240604-Linux-为 OpenWrt-23.05 添加自己的 feed 软件包】

调试笔记-系列文章目录 调试笔记-20240604-Linux-为 OpenWrt-23.05 添加自己的 feed 软件包 文章目录 调试笔记-系列文章目录调试笔记-20240604-Linux-为 OpenWrt-23.05 添加自己的 feed 软件包 前言一、调试环境操作系统&#xff1a;Ubuntu 22.04.4 LTS编译环境调试目标 二、…

HTML、HTML5一览

文章目录 HTML简介标签基本标签格式化文本链接图像块级元素列表表格框架表单实体 HTML5 此篇用于优化csdn第一篇文章 HTML 简介 HTML 是用来描述网页的一种语言。 HTML 指的是超文本标记语言: HyperText Markup Language HTML 不是一种编程语言&#xff0c;而是一种标记语言…

数据中心的中台前端风格大屏设计开发

数据中心的中台前端风格大屏设计开发

DevOps全面综述:从概念到实践

一、背景与概述 1.1 DevOps的起源与发展 DevOps&#xff08;Development and Operations的缩写&#xff09;是软件工程领域中的一种文化和实践方法&#xff0c;旨在促进开发团队与运维团队之间的协作&#xff0c;从而实现更高效、更可靠的软件交付。DevOps起源于敏捷软件开发方…

Spring类加载机制揭秘:深度解析“准备”阶段

1. 引言 在Spring框架中&#xff0c;类加载机制是一个至关重要的环节&#xff0c;关系到Spring容器如何动态地加载、解析和管理应用程序中的类。其中&#xff0c;“准备”阶段作为类加载过程中的一个关键步骤&#xff0c;对于理解整个类加载机制具有重要意义。本文将对Spring类…

深入了解 Postman 中的变量

在我们进行 API 开发和测试时&#xff0c;使用诸如 Postman 之类的工具可以极大地简化工作流程&#xff0c;提高效率。Postman 的一个强大功能就是变量&#xff08;Variables&#xff09;。利用变量&#xff0c;我们可以使我们的请求变得更加动态和灵活&#xff0c;避免重复输入…

猫毛过敏的克星!宠物空气净化器,铲屎官的终极武器~

现在很多人都喜欢养猫&#xff0c;但约有10%的人会对猫咪产生过敏反应。常见的症状包括打喷嚏、流鼻涕&#xff0c;严重时甚至会呼吸困难。 过敏源依附在宠物的毛发和皮屑上&#xff0c;通过空气传播&#xff0c;遍布家中的各个角落&#xff0c;如地面、衣物和家具。这不仅增加…

期权和股权有哪些含义?股权和期权有哪些区别?

今天带你了解期权和股权有哪些含义&#xff1f;股权和期权有哪些区别&#xff1f;股权是有限责任公司或股份有限公司股东对公司享有的人身权和财产权的综合权利。期权是指赋予持有者在特定日期或之前以固定价格购买或出售资产的权利的合同。 期权有哪些含义&#xff1f; 期权是…

Echarts 取消鼠标滑动时产生的竖线

文章目录 问题分析问题 当我们在坐标轴中使用多组数据时会产生如下效果,出现两根竖线,不太美观 分析 axisPointer 属性设置为 none(建议使用) 在 ECharts 中,鼠标滑动时产生的竖线是由 tooltip 组件的 axisPointer 属性控制的。要取消这一功能,可以将 tooltip 组件的 …

Java18新特性有哪些

Java 18 于 2022 年 3 月 22 日正式发布&#xff0c;它带来了一些新特性和改进&#xff0c;主要包括以下几点&#xff1a; JEP 400: UTF-8 by Default123&#xff1a;JDK 将 UTF-8 设置为默认字符集&#xff0c;这使得依赖于默认字符集的 API 在所有实现、操作系统、区域设置和…

加入不正确的位置编码会破坏掉原本的信息吗?

会 位置编码的作用 在Transformer中&#xff0c;位置编码的主要作用是让模型感知输入序列中各个词的位置。因为Transformer完全依赖自注意力机制&#xff0c;它本身并没有序列信息&#xff0c;位置编码的引入就是为了补充这一点。 加法操作的合理性 位置编码通过加法操作与…

震惊!没想到这个国产数据库可以白嫖!

最近很多网友私信我&#xff0c;问我们MogDB是怎么售卖的&#xff0c;你们的具体策略是怎么样的&#xff1f; 其实这个话题我在一些微信群都已经讲过&#xff0c; 这里干脆来一篇公众号文章&#xff0c;详细说一说&#xff01; MogDB是什么&#xff1f; MogDB是 EnMotech openG…

Python群发邮件的功能如何实现?怎么使用?

Python群发邮件需要哪些库支持&#xff1f;如何使用Python发信&#xff1f; 对于Python开发者来说&#xff0c;实现群发邮件功能是一项非常有用的技能&#xff0c;无论是用于营销、通知还是其他目的。AokSend将介绍如何使用Python来实现群发邮件的功能&#xff0c;让你轻松管理…

yolov8魔改之Ghost引入

Ghost层是在CVPR 2020上由华为诺亚方舟实验室提出的7。它是一种新型的端侧神经网络架构,称为GhostNet。Ghost层的核心思想是通过廉价操作生成更多的特征图,从而在保持精度的同时减少计算量和参数量。 技术上的提升主要体现在以下几个方面: 参数和计算量的减少:Ghost模块使…

AAA认证,授权,计费

AAA 认证&#xff0c;授权&#xff0c;计费 AAA常见的网络架构 用户&#xff0c;NAS&#xff0c;AAA服务器 NAS负责集中收集和管理用户的访问请求。 在NAS上会创建多个域来管理用户&#xff0c;不同的域可以关联不同的AAA方案。 当收到用户接入网络的请求时&#xff0c;N…

【优选算法】字符串 {相关编程题解析}

一、相关编程题 1.1 最长公共前缀 题目链接 14. 最长公共前缀 - 力扣&#xff08;LeetCode&#xff09; 题目描述 算法原理 编写代码 // 解法一&#xff1a;两两比较 class Solution { public:string longestCommonPrefix(vector<string>& strs) {int k strs[0…

当边缘计算用在定位设备

什么是边缘计算&#xff1f; 边缘计算是个比较高大上的概念&#xff0c;在这里就不提众多官方与非官方的定义了&#xff0c;只说说自己的理解。 边缘计算就是在最靠近物理设备的使用现场&#xff0c;利用有限的硬件资源&#xff0c;完成设备层数据采集、协议转换、数据上传、…