work-notes(19):JS 引用类型数据,明明输出可以看得到数据,为什么取值却为空,或者对值判断或操作时 undefined 找不到?

本文探讨了在Vue2.0中遇到的异步数据获取问题,当尝试从封装函数中获取数组数据进行操作时,由于异步请求的性质,导致数据未及时填充到变量中。解决方案是采用asyncawait语法确保数据加载完成后再进行操作。通过示例展示了使用asyncawait后的效果,强调了正确处理异步操作的重要性,避免出现undefined或false的错误结果。
摘要由CSDN通过智能技术生成

时间:2022-06-28

摘要

就是明明数组、对象等可以输出看得到数据,但取不到值;取值都是 undefined ;

因为这些都是引用类型数据,代码写的是在操作之后输出,但是实际上在操作之前进行输出,所以为空;

为什么能输出:
因为只是简单的 = (赋值),指向地址,数据可以输出,但是实际上输出的变量是没有存值的;

问题描述

今天写代码的时候发现了个大问题;

1、数组数据是通过封装的函数获取的;

2、log 输出数组 可以得到数据;

3、但在进行操作时却拿不到数据,
   比如说类型判断,或者 arr.includes(xxx)是否在数组内时,返回都是为 false;
   
整体使用vue2.0写的;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这个是我封装的函数,也有问题;
在这里插入图片描述

问题解析

1、首先说我封装的函数;

(1)封装的函数,里面 projectPageListzhx({}) 用到了 then() 是一个异步请求;

(2)我这里先声明了数组 proIds 接收,然后 return 出去;看似没毛病实际大得很;

(3)异步请求,实际上中间相当于一个 定时器(setTimeout类型),即后面代码 return 了,
	上面的请求还不一定执行完;(所以这个函数返回一个空置)
	
(4)所以 typeOf 输出为 undefined;

解决思路

1、通过深拷贝方式;
	(1)通过递归方式;
	(2)JSON.parse(JSON.stringify(obj));
	(3)jQuery.extend() 函数;

2、多用 async await

这里重点讲 async await

1、使用 async await

这个函数执行,当声明了 proIds 空数组后,会等待 await 代码执行完毕;确保了 return 是有数据的;

使用后:
在这里插入图片描述
使用前:
在这里插入图片描述

2、取出数据

1、如果你直接 log 输出可以看见是一个 promise 对象;

2、如何取出很简单,在取出之前套一层 await 即可;虽然看似复杂但是能保证代码质量;
	也比处理异步操作简单多了;

直接输出为 promise 对象
在这里插入图片描述

解析获取直接数据,套一个 await在前面
在这里插入图片描述
后面的 includes 就能获取到数组内的数据,如果有就返回 ture了;
没加 async await 之前弄了很久都是 false 而且输出还显示有数据;

标注

1、用了 async await 就不用使用 then() 方法了;可返回去看我没用了;

总结

1、对于引用类型数据,当只是简单的浅拷贝 特别例如赋值(=)的方式时,可能导致取不到值;

2、异步请求时,相当于定时器执行,后面的代码可能都已经执行了,前面的还没有执行;
所以相当于在操作之前输出,导致输出找不到;
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值