用的vue3 和element plus,在代码中
const find = async () => { const res = await axios.put('http://localhost:8080/travel/find/' + id); categorys.value = res.data.data; console.log(res.data.data); const code = res.data.data[0].ydcode; localStorage.setItem('code', code); // console.log(categorys.value.id) // console.log(code.ydcode);};find();console.log(localStorage.getItem('code'));const code1 = localStorage.getItem('code');console.log(code1);const flag = code1 == 1 ? true : false;console.log(flag);
每次code1获取到的值都是上一次存入的值,网上搜说是因为异步的关系,具体应该怎么修改请大佬指导!
这段代码可能存在以下问题:
1、可能抛出错误,但未处理
2、categorys.value可能不是数组
3、code可能不是对象
4、尝试访问code的属性时可能会出错
5、尝试访问code1时可能会出错
const res = await axios.put('http://localhost:8080/travel/find/' + id);try { const data = res.data.data; if (data && data.length > 0) { categorys.value = data; console.log(data); const code = data[0]; localStorage.setItem('code', JSON.stringify(code)); console.log(localStorage.getItem('code')); const code1 = JSON.parse(localStorage.getItem('code')); console.log(code1); const flag = code1.ydcode === '1'; console.log(flag); } else { console.log('No data found'); }} catch (error) { console.error('Error:', error);}
这段代码假设categorys.value是一个数组,code是一个对象,code1是一个字符串,并且localStorage.getItem('code')返回一个有效的JSON字符串。
const find = async () => { const res = await axios.put('http://localhost:8080/travel/find/' + id); categorys.value = res.data.data; console.log(res.data.data); const code = res.data.data[0].ydcode; localStorage.setItem('code', code); // console.log(categorys.value.id) // console.log(code.ydcode);};find();console.log(localStorage.getItem('code'));const code1 = localStorage.getItem('code');console.log(code1);const flag = code1 == 1 ? true : false;console.log(flag);
问题出现在异步操作上,localStorage.setItem('code', code);
是一个异步操作,而在下面的代码中,你立即尝试获取 localStorage.getItem('code')
的值。由于异步操作的特性,存储操作可能尚未完成,所以你得到的值可能是上一次的值。
为了解决这个问题,你可以将后续的代码逻辑放在 localStorage.setItem
的回调函数中,确保在存储操作完成后再执行后续操作。
const find = async () => { try { const res = await axios.put('http://localhost:8080/travel/find/' + id); categorys.value = res.data.data; console.log(res.data.data); const code = res.data.data[0].ydcode; // 使用Promise确保localStorage.setItem操作完成后再执行后续代码 return new Promise((resolve) => { localStorage.setItem('code', code); resolve(); }); } catch (error) { console.error("Error in find:", error); }};find().then(() => { // 在localStorage.setItem完成后执行后续代码 console.log(localStorage.getItem('code')); const code1 = localStorage.getItem('code'); console.log(code1); const flag = code1 == 1 ? true : false; console.log(flag);});
题主对于js的事件循环机制还不够熟悉,建议题主多回顾JS基础内容。
对于js执行引擎,在执行find()
后,并没有等find()
执行完成。而是立即继续执行下面的console.log
的代码(宏任务),而find
中的代码(微任务)会被放在主代码执行完后才会执行。
const getCode = async (id) => { const res = await axios.put('http://localhost:8080/travel/find/' + id); return res.data.data[0].ydcode;};const init = async () => { const code = await getCode('xxxx'); localStorage.setItem('code', code);};const main = async () => { await init(); const code = localStorage.getItem('code'); // do whatever you want};main();
find函数作用域中才是异步等待的 不是当前逻辑都是的异步。
这个函数如果需要改造的话 应该只让函数做一件事。
const find = () => { return new Promise(async (resolve) => { let res = await axios.put('http://localhost:8080/travel/find/' + id) categorys.value = res.data.data; resolve(res.data.data[0].ydcode) })}find().then((code: number) => { // 其他逻辑都不应该在 find 函数内部做 const flag = code === 1; console.log(flag)})
let flag = (code1 == 1) ? true : false;
直接简写 const flag = code1 === 1;
find().then(() => { console.log(localStorage.getItem('code')})
由于项目的一些原因,我需要在打包的时候开启 cssCodeSplit 配置项目。如下图: 这样就会造成我每次打包的时候,就会在 dist 目录下自动生成这两个文件。 现在的问题就是,别的项目引入这个组件库的时候,必须在 main.ts 文件写两行这样的代码,引入样式文件以后才能正常使用我的这个组件库。 问题:vite 有没有什么配置可以设置打包后的文件路径呢?比如可以在每次打包的时候自动生成一个
本文向大家介绍Go 语言json.Unmarshal 遇到的小问题(推荐),包括了Go 语言json.Unmarshal 遇到的小问题(推荐)的使用技巧和注意事项,需要的朋友参考一下 1.问题现象描述 使用 json.Unmarshal(),反序列化时,出现了科学计数法,参考代码如下: 这个问题不是必现,只有当数字的位数大于 6 位时,才会变成了科学计数法。 2.问题影响描述 当数据结构未知,使用
本文向大家介绍在IDEA中安装scala、maven、hadoop遇到的问题小结,包括了在IDEA中安装scala、maven、hadoop遇到的问题小结的使用技巧和注意事项,需要的朋友参考一下 小白在通过IDEA使用scala、maven、hadoop遇到的问题 问题一:idea new 新文件没有scala;File->setting->Plugins,然后搜索scala插件安装。安装完成后重
本文向大家介绍更新了Xcode8 及 iOS10遇到的问题小结,包括了更新了Xcode8 及 iOS10遇到的问题小结的使用技巧和注意事项,需要的朋友参考一下 更新了Xcode8 以及 iOS10,App访问用户的相机、相册、麦克风、通讯录的权限都需要重新进行相关的配置,不然在Xcode8中打开编译的话会直接crash。 需要在info.plist中添加App需要的一些设备权限。 相机NSCame
web端项目想通过接口拿到视频文件,但是显示执行到sourceBuffer.appendBuffer的时候报错了,不知道为什么??? 这是渲染视频的逻辑 这是前端api接口 这里是我自己写的node返回视频文件的接口 尝试了下面朋友的方法 还是会报一样的错误