前端面试场景题 1 (批量处理toast、减少if-else)

ops/2025/2/26 2:57:41/

一、请求失败会弹出 一个toast , 如何保证批量请求失败 , 只弹出一个toast 

方法一:使用全局标志位

JavaScript

let isToastShown = false; // 全局标志位function makeRequests() {const requests = [fetchPost(),fetchComments()]; // 多个请求Promise.all(requests).then(() => {// 所有请求成功的处理逻辑}).catch(errors => {if (!isToastShown) {// 检查标志位notify(errors[0]); // 弹出 toastisToastShown = true; // 设置标志位为 true}});
}function fetchJSON(url, input) {return fetch(url, input).then(res => {if (res.ok) {return res.json();}const err = new HttpError(res);if (!isToastShown) { // 检查标志位notify(err); // 弹出 toastisToastShown = true; // 设置标志位为 true}throw err; // 确保错误被抛出,否则后续逻辑可能无法捕获});
}// 示例错误类
class HttpError extends Error {constructor(response) {super(`${response.status} ${response.statusText}`);this.name = "HttpError";this.response = response;}
}// 重置标志位(在新的请求开始前)
makeRequests().finally(() => {isToastShown = false; // 确保在下一次请求时标志位被重置
});
方法二:使用防抖函数

JavaScript

// 防抖函数
function debounce(fn, delay = 1000) {let timeout;return function (...args) {clearTimeout(timeout);timeout = setTimeout(() => {fn.apply(this, args);}, delay);};
}const notifyDebounced = debounce(message => {notify(message);
}, 3000); // 3 秒内只执行一次// 示例调用
fetchJSON(url, input).catch(err => {notifyDebounced(err); // 使用防抖后的通知函数});
方法三:集中处理错误

JavaScript

function makeRequests() {const requests = [fetchPost(),fetchComments()]; // 多个请求Promise.allSettled(requests).then(results => {const hasError = results.some(result => result.status === "rejected");if (hasError) {const firstError = results.find(result => result.status === "rejected").reason;notify(firstError); // 合并所有错误并只弹出一次} else {// 所有请求成功的处理逻辑}});
}

二、减少项目中的 if-else 语句

1. 策略模式

JavaScript

// 定义策略对象
const strategies = {condition1: (arg) => {// 处理条件 1 的逻辑console.log(`Handling condition1 with argument: ${arg}`);},condition2: (arg) => {// 处理条件 2 的逻辑console.log(`Handling condition2 with argument: ${arg}`);},// 更多条件和处理逻辑
};// 动态获取条件并执行策略
function handleCondition(condition, arg) {const strategy = strategies[condition];if (strategy) {strategy(arg);} else {console.log(`Unknown condition: ${condition}`);}
}// 示例调用
handleCondition("condition1", "foo"); // 输出:Handling condition1 with argument: foo
handleCondition("condition3", "bar"); // 输出:Unknown condition: condition3
2. 表驱动法(动态条件)

JavaScript

const handlers = {"condition1": (arg) => console.log(`Handling condition1 with ${arg}`),"condition2": (arg) => console.log(`Handling condition2 with ${arg}`),// 其他条件处理函数
};function processConditions(conditions, arg) {conditions.forEach(condition => {const handler = handlers[condition];handler && handler(arg);});
}// 示例调用
processConditions(["condition1", "condition2"], "data"); // 输出两个条件的处理结果
3. 提取函数

JavaScript

function handleCaseA() {// 大量逻辑 A
}function handleCaseB() {// 大量逻辑 B
}function main() {const type = getType();if (type === "A") {handleCaseA();} else if (type === "B") {handleCaseB();} else {console.log("Unknown type");}
}
4. 状态模式

JavaScript

// 定义状态类
class State {handle(context) {console.log("Default state handling");}
}class StateA extends State {handle(context) {console.log("Handling State A");context.state = new StateB(); // 转换状态}
}class StateB extends State {handle(context) {console.log("Handling State B");context.state = new StateA();}
}// 上下文对象
class Context {constructor() {this.state = new StateA();}request() {this.state.handle(this);}
}// 示例调用
const context = new Context();
context.request(); // 输出:Handling State A
context.request(); // 输出:Handling State B

总结

  • 全局标志位:适用于简单的单次通知场景。

  • 防抖节流:适用于需要限制通知频率的场景。

  • 集中处理错误:适用于批量请求的错误统一管理。

  • 策略模式/表驱动法:将条件逻辑抽离为独立模块,增强可维护性。

  • 状态模式:适用于对象状态频繁变化的场景。


http://www.ppmy.cn/ops/161331.html

相关文章

量子比特的实现与优化技术:解密量子计算的核心

量子比特的实现与优化技术:解密量子计算的核心 大家好,我是Echo_Wish,今天我们来聊聊量子计算中的一个核心概念——量子比特(qubit)的实现与优化技术。量子比特作为量子计算的基本单位,与经典计算中的比特有着本质的不同。本文将深入探讨量子比特的实现方法及其优化技术…

JS复习练习题目、完整nodejs项目以及Commons、Es

### JS复习练习 - ![20250220204925](/up-z0.qiniup.com20250220204925.png) 1. 任务1:创建一个简单的问候函数 - 编写一个函数greet,接受一个名字作为参数,并返回一个问候语,例如:“Hello, [名字]! Welcome to Jav…

基于AVue的二次封装:快速构建后台管理系统的CRUD方案

基于AVue的二次封装:快速构建后台管理系统的CRUD方案 在开发后台管理系统时,表格是常见的组件之一。然而,使用原生的Element Plus实现CRUD(增删改查)功能往往需要编写大量重复代码,过程繁琐。即使借助类似…

mysql的主从配置

#mysql数据库 #主从 MySQL数据库主从配置 1.MySQL主从介绍 MySQL 主从又叫做 Replication、AB 复制。简单讲就是 A 和 B 两台机器做主 从后,在 A 上写数据,另外一台 B 也会跟着写数据,两者数据实时同步的。 MySQL 主从是基于 binlog 的&…

WebGL 加载 .obj 格式文件

摘要 WebGL 作为一种在网页上实现高性能 3D 图形渲染的技术,为网页开发者提供了强大的工具。而 .obj 文件是一种常见的 3D 模型文件格式,被广泛应用于 3D 设计和开发领域。本文将深入探讨如何使用 WebGL 加载 .obj 格式的文件,涵盖了 .obj 文…

跟着李沐老师学习深度学习(十四)

注意力机制(Attention) 引入 心理学角度 动物需要在复杂环境下有效关注值得注意的点心理学框架:人类根据随意线索和不随意线索选择注意力 注意力机制 之前所涉及到的卷积、全连接、池化层都只考虑不随意线索而注意力机制则显示的考虑随意…

怎么让电脑上的摄像头无绿幕使用背景虚化/虚拟背景、视频无绿幕使用背景虚化、虚拟摄像头无绿幕背景虚化

参考: http://t.csdnimg.cn/EKHFG https://github.com/aisegmentcn/aisegment_obs_plugin https://obsproject.com/forum/resources/virtual-background-by-aisegment.1546/ 腾讯会议中是可以使用虚拟背景的,但是其他视频会议软件没有,那怎么…

C++ 编程语言简介

C 是一种通用编程语言,它是作为 C 语言的增强而开发的,以包含面向对象的范例。它是一种命令式和编译语言。 C 是一种高级的通用编程语言,专为系统和应用程序编程而设计。它由贝尔实验室的 Bjarne Stroustrup 于 1983 年开发,作为…