书写腾讯天气遇到的问题

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

一、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

三、深拷贝的实现与应用

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

深拷贝函数

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

javascript 复制代码
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来快速实现深拷贝:

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

四、数组操作的索引错误

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

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

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

解决方案

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

javascript 复制代码
const theDeleteIndex = attentionCity.findIndex(item => item.id === id);
if (theDeleteIndex !== -1) {
  attentionCity.splice(theDeleteIndex, 1);
  console.log('删除成功');
} else {
  console.log('未找到对应城市');
}
相关推荐
文心快码BaiduComate1 分钟前
基于YOLOv8的动漫人脸角色识别系统:Comate完成前端开发
前端·后端·前端框架
需要兼职养活自己1 分钟前
react 之redux
前端·react.js·redux
ら陈佚晨6 分钟前
React 18 的核心设计理念:并发渲染
前端·javascript·react.js·前端框架·fiber
草字1 小时前
uniapp 打开横竖屏。usb调试时可以横竖屏切换,但是打包发布后却不行?
java·前端·uni-app
EF@蛐蛐堂1 小时前
Federation vs Garfish vs Micro-app 微前端选型(二)
前端·vue.js·前端框架
洋不写bug1 小时前
前端html基础标签
前端·html
GISer_Jing1 小时前
前端学习总结——AI&主流前沿方向篇
前端·人工智能·学习
尘世中一位迷途小书童1 小时前
Monorepo 工具大比拼:为什么我最终选择了 pnpm + Turborepo?
前端·架构
一枚前端小能手1 小时前
🔍 重写vue之ref和reactive
前端·javascript·vue.js
星链引擎1 小时前
4sapi.com开发者进阶版(技术导向,侧重 “原理 + 最佳实践”)
前端