当前位置: 首页 > ops >正文

书写腾讯天气遇到的问题

腾讯天气中遇到的几个问题

一、axios拦截器的死循环困境

在对接天气的接口时,因为我采用jwt的身份验证,需要通过axios请求拦截器统一携带Token。最开始的逻辑是:拦截器里调用getToken函数获取JWT,然后每次请求(包括getToken自身发送的请求)都会触发拦截器。

结果就是,如果getToken是通过axios发送请求,就会陷入无限递归调用,拦截器→getToken→拦截器→getToken,最终请求失败。

解决方案

通过 create() 创建两个完全独立的 axios 实例,避免拦截器的重复拦截。

二、axios响应取值

后端返回的Token数据格式是{“token”: “xxx”},但前端代码中获取token时,一直拿到undefined。检查后发现,是对axios响应结构理解错了。

axios的响应结构是{ data: 后端返回的内容, status: 200, … },所以正确的取值应该是response.data.token,而不是直接取response.token

三、深拷贝的实现与应用

在腾讯天气的城市基本信息保存中,需要对复杂的天气数据对象进行拷贝,进行本地存储中数据的更新,避免拷贝引用。

深拷贝函数

深拷贝函数,能处理基本类型、数组和对象的深拷贝:

function deepClone(obj) {if (obj === null || typeof obj !== 'object') {return obj;}// 处理数组if (obj instanceof Array) {const arrCopy = [];for (let i = 0; i < obj.length; i++) {arrCopy[i] = deepClone(obj[i]); // 递归拷贝子元素}return arrCopy;}// 处理对象const objCopy = {};for (const key in obj) {if (obj.hasOwnProperty(key)) {objCopy[key] = deepClone(obj[key]); // 递归拷贝子对象}}return objCopy;
}

JSON方法实现深拷贝

如果数据中没有函数、正则等特殊类型,也可以用JSON.stringifyJSON.parse来快速实现深拷贝:

const original = { city: '广州', weather: { type: '晴', temp: 25 } };
const str = JSON.stringify(original);// 序列化丢失引用关系
const copy = JSON.parse(str);// 反序列化

四、数组操作的索引错误

在处理腾讯天气的城市关注列表时,需要根据城市id删除对应的关注项。最初用find方法来查找要删除的元素:

// 错误:find 返回的是匹配的元素对象,而不是索引
const theDeleteIndex = attentionCity.find(item => item.id === id);
attentionCity.splice(theDeleteIndex, 1);

结果就是删错位置,甚至删错元素,因为find方法返回的是第一个匹配的元素对象(比如{ id: '101210106', ... }),而不是索引(数字)。后续用splice(theIndex, 1)时,会把“元素对象”当成索引,导致搜索城市后的历史更新出错。

解决方案

findIndex替代findfindIndex返回匹配元素的索引):

const theDeleteIndex = attentionCity.findIndex(item => item.id === id);
if (theDeleteIndex !== -1) {attentionCity.splice(theDeleteIndex, 1);console.log('删除成功');
} else {console.log('未找到对应城市');
}
http://www.xdnf.cn/news/19591.html

相关文章:

  • 虚拟继承:破解菱形继承之谜
  • 【论文阅读】Deepseek-VL:走向现实世界的视觉语言理解
  • Postman接口测试工具:高效管理测试用例与环境变量,支持断言验证及团队协作同步
  • 软件设计师——软件工程学习笔记
  • 前端架构知识体系:常见压缩算法全解析及原理揭秘(gzip、zip)
  • 麒麟信安受邀出席第三届电子信息测试产业大会,参编四项团标发布,详解麒麟信安操作系统测试全流程
  • Navicat vs DBeaver vs DataGrip:三款主流数据库客户端深度对比与选择
  • 力扣222 代码随想录Day15 第四题
  • 【高并发内存池】三、线程缓存的设计
  • Steam开发者上架游戏完整指南(含具体技术细节)
  • 【最新Pr 2025安装包(Adobe Premiere Pro 2025 中文解锁版)安装包永久免费版下载安装教程】
  • Java-Spring入门指南(一)Spring简介
  • 如何把HTML转化成桌面Electron
  • B树和B+树,聚簇索引和非聚簇索引
  • 网络准入控制,阻断违规外联-企业内网安全的第一道防线
  • 通用的二叉数迭代方法
  • 深入浅出 RabbitMQ-TTL+死信队列+延迟队列
  • 如何使用Kafka处理高吞吐量的实时数据
  • 赵玉平《跟司马懿学管理》读书笔记
  • 智能高效的Go IDE——GoLand v2025.2全新上线
  • 图像编码--监控摄像机QP设置大小?
  • Git 代码提交管理指南
  • 为啥我Nginx证书配的没问题,但客户端却发现证书不匹配?
  • 从零开始搭建体育电竞比分网,手把手教你全流程
  • 京东科技大模型RAG岗三轮面试全复盘:从八股到开放题的通关指南
  • 若想将gpu的代码在昇腾npu上运行,创建docker应该创建怎么样的docker?(待完善)
  • 从模态融合到高效检索:微算法科技 (NASDAQ:MLGO)CSS场景下的图卷积哈希方法全解析
  • 【XR硬件系列】Apple Vision Pro 完全解读:苹果为我们定义了怎样的 “空间计算” 未来?
  • 【C语言指南】回调函数:概念与实际应用的深度剖析
  • 【LeetCode热题100道笔记】前 K 个高频元素