【JS基础】一些个人积累的原生JS编码设计思想,和大家一起开拓下思维

文章目录

  • 前言
  • 对象配置
  • 链式调用
  • 队列调用
  • 并发执行
  • 未完待续

前言

以下都是我个人遇到的前端JS原生编码设计上的一些案例记录,希望能帮助新手开拓写代码的思想,并且能够结合自己的想法应用在实际的项目中,写出更加易读,拓展,维护的代码。

在其中会有一些案例展示,并不是说某个写法只能用于该案例上,要学会举一反三。

还有一点就是不要死记这些东西(我自己也记不住,叫我重写都未必能写出),留有个印象就好,等到某天你发现某个场景可以使用到下面的写法时,再对应的拿取用。


对象配置

就是一个总函数,可以通过传入的对象配置项,开启函数内部的一些特定模块的处理,例子如下:

// 总函数
function fn(target, config = {}) {// A模块处理默认开启if (config.handleA === true || config.handleA === undefined) {handleA()}// B模块手动开启if (config?.handleA === true) {handleB()}
}// handleA处理模块
function handleA(){}// handleB处理模块
function handleB(){}// ...

举个使用在项目上的例子,例如我封装axios的时候,如果是一些简单的项目,就只需要做一层封装即可,然后在写接口请求方法的时候只需要:

import request from "@/utils/request";/*** 登请求*/
export const login = (data) => {return request({url: "/sys/login",method: "POST",data,needLoading: true, // 是否有请求动画,默认给truehandleErrer: false, // 是否要手动处理错误信息,默认会自动报出接口错误信息// ...});
};

然后在axios的请求和响应拦截器中实现对应的功能即可。


链式调用

这是我个人认为最好理解和记忆的编写方法:

class _Print {// 初始化constructor() {this.queue = [this.init] // 执行栈this.next()}// 初始化钩子init() {console.log('初始化钩子')// 这里要开启下一轮事件循环再执行栈中的任务,保证链式调用的任务已推入setTimeout(() => {this.next();}, 0)}// 同步执行print(msg) {let fn = function () {console.log(msg);this.next()}this.queue.push(fn)return this}// 延迟delay(time) {let fn = function () {setTimeout(() => {this.next()}, time)}this.queue.push(fn)return this}// 弹出栈任务并执行next() {let fn = this.queue.shift() // 这里重新定义了函数,不再是指向实例了fn && fn.call(this)}
}new _Print().print('1').delay(3000).delay(3000).print('2')

问题来了,这种链式调用能用在什么场景下呢?暂时没想到哈哈。


队列调用

就是把要经过的任务都推入到任务队列里,然后挨个执行,例子如下:

function p() {let promise = Promise.resolve()function fn1(result) { // 功能封装1console.log('fn1');return Promise.resolve('fn1')}function fn2(result) { // 功能封装2console.log('fn2');return Promise.resolve('fn2')}let arr = [fn1, fn2]while (arr.length) {promise = promise.then(arr.shift())}return promise
}p('1') // fn1 fn2 轮流执行

可以用在对axios进行更深入的封装,可以参考我这篇文章:【场景方案】如何去设计并二次封装一个好用的axios,给你提供一个另类写法,另加一些思考


并发执行

并发执行任务的时候,我们要做好每次的并发量。一般这种并发场景都是异步请求,所以必然涉及到Promise,这里也就拿Promise去写示例:

// 模拟100个异步请求
const arr = [];
for (let i = 0; i < 100; i++) {arr.push(() => new Promise((resolve) => {setTimeout(() => {console.log('done', i);resolve();}, 100 * i);}));
};const parallelRun = () => {const runingTask = new Map(); // 记录正在发送的异步请求(闭包存储)const inqueue = (totalTask, max) => { // 异步请求队列,每组请求的最大数量// 当正在请求的任务数量小于每组请求的最大数量,并且还有任务未发起时,就推入请求while (runingTask.size < max && totalTask.length) {const newTask = totalTask.shift(); // 弹出新任务const tempName = totalTask.length; // 以长度命名?runingTask.set(tempName, newTask);newTask().finally(() => {runingTask.delete(tempName);inqueue(totalTask, max); // 每次一个任务完成后就继续塞入新任务});}}return inqueue;
};parallelRun()(arr, 6);

有人会问为啥不直接用all方法呢?因为只要期中一个任务失败了,整个队列都没用了。详细可以看【es6入门】好好捋一捋Promise与Async的异步写法,细节满满


未完待续

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

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

相关文章

2023国赛数学建模B题思路模型代码 高教社杯

本次比赛我们将会全程更新思路模型及代码&#xff0c;大家查看文末名片获取 之前国赛相关的资料和助攻可以查看 2022数学建模国赛C题思路分析_2022国赛c题matlab_UST数模社_的博客-CSDN博客 2022国赛数学建模A题B题C题D题资料思路汇总 高教社杯_2022国赛c题matlab_UST数模社…

解决“topk_cpu“ not implemented for ‘Half‘

一、问题描述 如题报错&#xff1a;“topk_cpu” not implemented for ‘Half’ 是在使用transformers库时本地导入某个模型&#xff0c;完整报错如下&#xff1a; File "/Users/guomiansheng/anaconda3/envs/ep1/lib/python3.8/site-packages/torch/utils/_contextlib.p…

安卓监听端口接收消息

文章目录 其他文章监听端口接收消息 建立新线程完整代码 其他文章 下面是我的另一篇文章&#xff0c;是在电脑上发送数据&#xff0c;配合本篇文章&#xff0c;可以实现电脑与手机的局域网通讯。直接复制粘贴就能行&#xff0c;非常滴好用。 点击连接 另外&#xff0c;如果你不…

AI 绘画Stable Diffusion 研究(十二)SD数字人制作工具SadTlaker插件安装教程

免责声明: 本案例所用安装包免费提供&#xff0c;无任何盈利目的。 大家好&#xff0c;我是风雨无阻。 想必大家经常看到&#xff0c;无论是在产品营销还是品牌推广时&#xff0c;很多人经常以数字人的方式来为自己创造财富。而市面上的数字人收费都比较昂贵&#xff0c;少则几…

使用yolov5进行安全帽检测填坑指南

参考项目 c​​​​​​​​​​​​​​GitHub - PeterH0323/Smart_Construction: Base on YOLOv5 Head Person Helmet Detection on Construction Sites&#xff0c;基于目标检测工地安全帽和禁入危险区域识别系统&#xff0c;&#x1f680;&#x1f606;附 YOLOv5 训练自己的…

Opencv 视频的读取与写入

目录 前言 通过路径获取视频内容 获取视频内容 检查是否正确打开 循环播放 完整代码 从摄像头读取视频数据 获取视频设备 其他与直接读取视频一致 完整实例 录制视频 用于创建视频编解码器的四字符码&#xff08;FourCC&#xff09; cv2.VideoWriter() 将视频帧…

Spring MVC 中的常见注解的用法

目录 认识 Spring MVC什么是 Spring MVCMVC 的定义 Spring MVC 注解的运用1. Spring MVC 的连接RequestMapping 注解 2. 获取参数获取单个参数获取多个参数传递对象表单传参后端参数重命名RequestBody 接收 JSON 对象PathVariable 获取 URL 中的参数上传文件 RequestPart获取 C…

C++系列-内存模型

内存模型 内存模型四个区代码区全局区栈区堆区内存开辟和释放在堆区开辟数组 内存模型四个区 不同区域存放的数据生命周期是不同的&#xff0c;更为灵活。 代码区&#xff1a;存放函数体的二进制代码&#xff0c;操作系统管理。全局区&#xff1a;存放全局变量&#xff0c;常…

AutoSAR配置与实践(基础篇)2.5 RTE对数据一致性的管理

传送门 点击返回 ->AUTOSAR配置与实践总目录 AutoSAR配置与实践&#xff08;基础篇&#xff09;2.5 RTE对数据一致性的管理 一、 数据一致性问题引入二、 数据一致性的管理2.1 RTE管理 (SWC间)2.2 中断保护 (SWC内)2.3 变量保护IRVS (SWC内)2.4 Task分配2.5 任务抢占控制 一…

【linux】kernel编译时相关报错

文章目录 1. 问题现象及解决方式1. cc1: error: code model kernel does not support PIC mode 1. 问题现象及解决方式 1. cc1: error: code model kernel does not support PIC mode 问题&#xff1a;编译module时报错 原因&#xff1a;未指定交叉编译器&#xff0c;导致默认…

44、TCP报文(二)

接上节内容&#xff0c;本节我们继续TCP报文首部字段含义的学习。上节为止我们学习到“数据偏移”和“保留”字段。接下来我们学习后面的一些字段&#xff08;暂不包含“检验和”的计算方法和选项字段&#xff09;。 TCP首部结构&#xff08;续&#xff09; “数据偏移”和“保…

什么是LLM大语言模型?

什么是LLM大语言模型&#xff1f; 大语言模型&#xff08;英文&#xff1a;Large Language Model&#xff0c;缩写LLM&#xff09;&#xff0c;也称大型语言模型&#xff0c;是一种人工智能模型&#xff0c;旨在理解和生成人类语言。它们在大量的文本数据上进行训练&#xff0…

525. 连续数组

525. 连续数组 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a; 原题链接&#xff1a; 525. 连续数组 https://leetcode.cn/problems/contiguous-array/description/ 完成情况&#xff1a; 解题思路&#xff1a; 参考代码&#xff1a; …

解放数据库,实时数据同步利器:Alibaba Canal

文章首发地址 Canal是一个开源的数据库增量订阅&消费组件&#xff0c;主要用于实时数据同步和数据订阅的场景&#xff0c;特别适用于构建分布式系统、数据仓库、缓存更新等应用。它支持MySQL、阿里云RDS等主流数据库&#xff0c;能够实时捕获数据库的增删改操作&#xff…

JVM——垃圾回收(垃圾回收算法+分代垃圾回收+垃圾回收器)

1.如何判断对象可以回收 1.1引用计数法 只要一个对象被其他对象所引用&#xff0c;就要让该对象的技术加1&#xff0c;某个对象不再引用其&#xff0c;则让它计数减1。当计数变为0时就可以作为垃圾被回收。 有一个弊端叫做循环引用&#xff0c;两个的引用计数都是1&#xff…

如何用树莓派Pico针对IoT编程?

目录 一、Raspberry Pi Pico 系列和功能 二、Raspberry Pi Pico 的替代方案 三、对 Raspberry Pi Pico 进行编程 硬件 软件 第 1 步&#xff1a;连接计算机 第 2 步&#xff1a;在 Pico 上安装 MicroPython 第 3 步&#xff1a;为 Thonny 设置解释器 第 4 步&#xff…

C 语言的 strcpy() 函数和 strncpy() 函数

文章目录 strcpy() 函数strncpy() 函数 strcpy() 函数 <string.h> char *strcpy(char *dest, const char *src) 参数 dest – 指向用于存储复制内容的目标数组。 src – 要复制的字符串。 把 src 所指向的字符串复制到 dest。 需要注意的是如果目标数组 dest 不够…

【ARM-Linux】项目,语音刷抖音项目

文章目录 所需器材装备操作SU-03T语音模块配置代码&#xff08;没有用wiring库&#xff0c;自己实现串口通信&#xff09;结束 所需器材 可以百度了解以下器材 orangepi-zero2全志开发板 su-03T语音识别模块 USB-TTL模块 一个安卓手机 一根可以传输的数据线 装备操作 安…

高项4.项目管理核心技术.

第一部分 项目管理概论 价值驱动的项目管理知识体系: 十二项原则;生命周期四个阶段;五个过程组;十大PM知识领域;八大绩效域;外加价值交付系统; 自1987 年以来, PMBOK 一直是基于过程的项目管理标准的重要代表,项目管理从业者一 直坚持基于过程的项目管理方法。随着…

2023-8-20 单链表

题目链接&#xff1a;单链表 #include <iostream>using namespace std;const int N 100010;int head, e[N], ne[N], idx;void init() {head -1;idx 0; }// 将x插入到头结点 void add_to_head(int x) {e[idx] x;ne[idx] head;head idx;idx; }// 将x插入到下标k后面…