平昌移动网站建设宏福建设集团有限公司网站

张小明 2026/1/9 22:29:46
平昌移动网站建设,宏福建设集团有限公司网站,dw如何制作多个网页,巩义市建设局网站背景#xff1a;前端存在多个请求并发到后端#xff0c;默认览器运行最多6并发请求#xff0c;导致很多请求padding状态、而且后端处理不过来#xff1b;现象#xff1a;场景1#xff1a;如果这些数据可用丢包#xff0c;使用节流就可用解决#xff1b;- 简单不做赘述前端存在多个请求并发到后端默认览器运行最多6并发请求导致很多请求padding状态、而且后端处理不过来现象场景1如果这些数据可用丢包使用节流就可用解决- 简单不做赘述场景2如果这些数据不能丢包需要把数据合并再发送给服务器。要求加入需要等待服务器处理完再发下一包数据支持多个请求任务队列针对场景2问题需要解决以下三个1、请求任务上一个请求完成再开始执行下个任务2、队列中任务参数合并再发送请求3、支持多个任务在队列中进工作定义任务类型/** * 任务状态 */ export enum TaskStateE { unStart 0, // 未开始 start, // 执行中 end, // 执行完成 } /** * 任务对象 * template T 任务参数类型 */ export interface TaskItemTT unknown { taskName: string; // 任务名称 id: string | number; // 任务id state: TaskStateE; // 任务状态 count: number; // 执行次数 param: T; // 任务参数 startTime?: number; // 任务开始时间 endTime?: number; // 任务完成时间 start: (task: TaskItemTT) Promiseunknown; // 开始执行 /** * 可选的合并策略如果提供则使用该策略合并相同 taskName 的任务 */ mergeStrategy?: ITaskMergeStrategyT; }整体方案设计任务添加流程自定义Hook: useQueueTask.tsximport { useMemoizedFn, useUnmount } from ahooks; import { useRef } from react; import type { TaskItemT } from /enum/common; import { TaskStateE, TIMER_TIME } from /enum/common; /** * 通用任务队列 Hook * * description 提供任务队列管理功能支持任务添加、合并、执行和更新 * param options 配置选项 * returns 任务队列操作方法 * * example * tsx * const { addTask, updateTask, clearQueue } useQueueTask({ enableDebugLog: true }); * * addTask({ * taskName: fetchData, * id: 1, * state: TaskStateE.unStart, * count: 0, * param: { userId: 1 }, * start: (task) { * // 执行任务逻辑 * }, * }); * */ function useQueueTask() { // 任务队列 const queue useRefTaskItemT[]([]); // 任务定时器 const taskScheduler useRefReturnTypetypeof setInterval | null(null); // 正在执行的任务 const executingTask useRefTaskItemT | undefined(undefined); /** * 停止任务调度器 * description 清除定时器 */ const stopScheduler useMemoizedFn(() { if (taskScheduler.current ! null) { clearInterval(taskScheduler.current); taskScheduler.current null; } }); /** * 合并任务 * description 根据合并策略合并已存在的任务和新任务 * param existingTask 已存在的任务 * param newTask 新任务 * returns 合并后的任务 */ const mergeTask T unknown,(existingTask: TaskItemTT, newTask: TaskItemTT): TaskItemTT { if (newTask.mergeStrategy) { // 使用提供的合并策略 const mergedParam newTask.mergeStrategy.merge(existingTask.param as T, newTask.param); return { ...existingTask, param: mergedParam, start: newTask.start, // 使用新任务的 start 方法 mergeStrategy: newTask.mergeStrategy, }; } // 没有合并策略直接返回新任务替换 return newTask; }; /** * 添加任务 * description 将任务添加到队列中如果存在相同 taskName 的任务则根据合并策略处理 * param task 要添加的任务 */ const addTask useMemoizedFn(T unknown,(task: TaskItemTT) { const index queue.current.findIndex(item item.taskName task.taskName); if (index ! -1) { // 如果存在相同 taskName 的任务使用合并策略 const existingTask queue.current[index] as TaskItemTT; const mergedTask mergeTask(existingTask, task); queue.current.splice(index, 1, mergedTask); } else { // 不存在相同 taskName 的任务直接添加 queue.current.push(task as TaskItemT); } // 如果任务队列有任务则开始执行任务 startScheduler(); }); /** * 执行任务 * description 执行任务并处理错误 * param task 要执行的任务 */ const executeTask (task: TaskItemT) { // 原子性操作先设置任务和状态避免竞态条件 // 必须在调用 task.start 之前设置确保后续的 processTask 调用能够检测到正在执行的任务 if (executingTask.current ! undefined executingTask.current.id ! task.id) { // 如果当前已经有其他任务在执行不应该执行此任务这种情况理论上不应该发生但作为防御性编程 console.warn(Task execution skipped: another task is already executing, { currentTask: executingTask.current.id, newTask: task.id, }); // 将任务重新放回队列头部 queue.current.unshift(task); return; } // 设置执行中的任务标记原子操作 executingTask.current task; task.state TaskStateE.start; task.startTime Date.now(); // 确保 Promise 处理将返回值转换为 Promise // 使用 Promise.resolve 确保即使 task.start 返回同步值也能正确处理 let taskPromise: Promiseany; try { const result task.start(task); taskPromise Promise.resolve(result); } catch (error) { // 如果 task.start 同步抛出错误立即处理 taskPromise Promise.reject(error); } // 在 finally 中统一处理任务完成逻辑 taskPromise .finally(() { // 只有当前任务还在执行时才更新状态 // 这个检查很重要防止任务完成时被其他任务覆盖虽然理论上不应该发生 if (executingTask.current?.id task.id) { task.state TaskStateE.end; task.endTime Date.now(); // 清空正在执行的任务确保下一个任务可以执行 // 必须在所有状态更新完成后才能清空确保原子性 executingTask.current undefined; } }) .catch(error { // 错误已经在 finally 中处理这里只记录日志 // 不再重新抛出因为 finally 已经处理了状态清理 console.error(Task execution failed:, error); }); }; /** * 任务调度 * description 从队列中取出任务并执行支持批量处理相同名称的任务取最后一个 */ const processTask useMemoizedFn(() { // 严格检查只有在没有正在执行的任务时才能处理新任务 // executingTask.current undefined 表示当前没有任务在执行 if (executingTask.current ! undefined) { return; } // 检查队列是否有任务 if (queue.current.length 0) { return; } // 获取队首任务的名称 const firstTaskName queue.current[0]?.taskName; if (!firstTaskName) { return; } // 取队首任务 const task queue.current.shift(); if (task) { // 双重检查锁模式Double-Checked Locking // 在取出任务后、执行前再次检查确保原子性 // 这是为了防止多个 processTask 调用同时通过第一次检查 if (executingTask.current ! undefined) { // 如果此时已经有任务在执行将任务重新放回队列头部 queue.current.unshift(task); return; } // 执行任务executeTask 内部会立即设置 executingTask.current确保原子性 executeTask(task); } }); /** * 清空队列 * description 停止调度器、清空队列和正在执行的任务 */ const clearQueue useMemoizedFn(() { stopScheduler(); queue.current.length 0; executingTask.current undefined; }); /** * 启动任务调度器 * description 如果调度器未启动则启动定时器 */ const startScheduler useMemoizedFn(() { // 如果定时器已经启动不需要重复启动 if (taskScheduler.current ! null) { return; } taskScheduler.current setInterval(() { // 始终尝试处理任务processTask 内部会检查是否可以执行 processTask(); // 如果队列为空且没有正在执行的任务停止定时器 if (queue.current.length 0 executingTask.current undefined) { stopScheduler(); } }, TIMER_TIME); }); // 组件卸载时清理资源 useUnmount(() { clearQueue(); }); return { addTask }; } export default useQueueTask;业务代码调用添加任务addTask({ id: uuidv4(), taskName: ledScreenPainterClearApi, state: TaskStateE.unStart, count: 0, param: {a: 1}, start: (task: TaskItemT{ a: number }) { return ledScreenPainterClearApi(task.param); }, });
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

金科做的网站做生意的网站

Qwen3-VL本地部署实战:解锁PC端多模态AI视觉理解能力 【免费下载链接】Qwen3-VL-4B-Instruct-unsloth-bnb-4bit 项目地址: https://ai.gitcode.com/hf_mirrors/unsloth/Qwen3-VL-4B-Instruct-unsloth-bnb-4bit 还在为云端AI服务的高延迟和高成本烦恼吗&…

张小明 2026/1/7 22:32:49 网站建设

短链接生成站长工具房产网站 设计方案

本科论文答辩作为大学学业的收官之战,一直是毕业生关注的焦点。“答辩难吗?” 这个问题没有绝对答案,它既不是无法逾越的鸿沟,也并非轻易就能通关的 “走过场”。其难度本质上取决于论文质量、准备程度与应变能力的综合表现&#…

张小明 2026/1/7 22:32:50 网站建设

计算机怎么建设网站网络宣传渠道

Spring Boot基于Hadoop的微博舆情监测分析系统是一款强大的工具,它结合了Spring Boot框架的高效性和Hadoop的大数据处理能力,为微博舆情管理提供了全面的解决方案。以下是对该系统的详细介绍: 一、系统背景与意义 随着互联网的发展&#xf…

张小明 2026/1/7 22:32:49 网站建设

营销网站开发贵州企业网站建设策划

还在为产品展示角度单一而烦恼?为游戏角色缺少多角度参考图而困扰?传统3D建模和图像编辑需要专业技能和大量时间,而Qwen-Edit-2509多视角LoRA插件让这一切变得简单直观。这款AI图像编辑工具通过自然语言指令实现视角的精细化控制,…

张小明 2026/1/7 22:32:51 网站建设

企业门户网站的意义安徽省工程造价信息网

自动驾驶感知系统的多模态融合与鲁棒性优化技术解析 【免费下载链接】openpilot openpilot 是一个开源的驾驶辅助系统。openpilot 为 250 多种支持的汽车品牌和型号执行自动车道居中和自适应巡航控制功能。 项目地址: https://gitcode.com/GitHub_Trending/op/openpilot …

张小明 2026/1/7 22:32:52 网站建设

成都建立网站的公司网站注册城乡规划师培训机构哪个好

在非苹果硬件上运行macOS的旅程中,你是否曾为复杂的配置参数而困扰?Hackintool作为黑苹果世界的导航仪,将带你从基础检测到高级调试,层层深入系统配置的核心。这个工具不仅仅是参数调节器,更是理解硬件与系统交互的解码…

张小明 2026/1/7 22:32:55 网站建设