【踩坑__ob__: Observer实录】关键还是异步

博主分享了如何优化批量数据添加至数据库的过程,解决了异步操作导致的刷新问题和.ob:Observer引起的数组空值问题。通过定时器确保数据完整传递,并解释了.ob:Observer的处理和为何在处理异步后能访问到数组元素。
摘要由CSDN通过智能技术生成

项目背景

折腾了三四个小时,终于弄好了,虽然还有一些不明白的,但还是记录一下。

当我看到这个打印顺序的时候,就知道我终于成功了哈哈哈哈哈。

项目说明:

批量往数据库中添加数据。rest里面是键值对的形式,然后调用this.$service接口传到后端去,添加就好了。

昨天提交代码之后,老师说这样效率比较低,因为数据可以打包一起添加,所以没用必要边遍历边添加。所以需要改进。另外一个问题,刷新的功能没用实现,是个bug。

下面来解决:

首先解决刷新的问题吧cool-admin的组件,刷新的功能应该是在添加数据之后刷新,而我的bug产生在需要手动刷新,数据才能添加进去,判断是因为添加数据是进行异步操作,所以刷新这个同步事件会先执行,那么使用promise.then()解决

下面来解决将数据打包到数组中,然后添加。

也就是在这里碰到了__ob__: Observer.

我的处理方式:定义了一个全局变量作为数组,然后将每一次的数据push进去。这个地方如果是直接let一个数组=[],然后将数据push进去的话,后面使用它的时候,因为作用域的原因,貌似会得到一个空数组。所以定义的全局变量。

然后这个地方打印this.arr,拿到数据了,于是我直接传递给addMore函数了。 

 数据长这样:是的一个带有ob:Observer的数据。我在addMore那也查看到了,数据是这个数组,但是操作了,页面毫无变化,数据库也没变化

 于是打开开发者工具,查看网络请求,发现请求中的数组根本就是个空的。

这个项目以前做过类似的,然后我去那个地方也查看了一波就发现了两者的差异,那个数组上没有显示_ob_:Observer.

那就来解决这个。于是我就搜索了很多,对于这个究竟是什么大家可以看看这个博客

_ob_:Observer

网上有很多解决办法,其中有一种十分简单

 我理解的这串代码的目的就是深拷贝一份原来数组的值。于是我也试了,发现我这样做根本就直接得到空的数组。

然后我就开始乱打印了,是数据传递的地方我全部打印了一遍,终于让我发现了问题。

this.arr.push()中有一串代码是异步执行的,我在那个异步函数(函数A)那打印了一些东西,最后发现,this.arr的打印甚至在函数A前面打印。说到底就是异步的原因。最前面那个图就是最终我改动好了以后正确的执行步骤,应该是函数A先执行,然后在执行this.arr的传值,否则代码不是正确执行的,数据传递也不会完整,我觉得这才是真正的原因。

于是我加了个定时器,在定时器中执行传值。

问题解决。

在解决问题之后 我还是在定时器中打印了this.arr,这一次虽然这个数组身上依旧是有_ob_:Observer,但是为什么我可以拿到this.arr[0],this.arr[1]这些值,按照网上都说的不可枚举性,不应该是拿不到的吗,确实我在没有处理异步的时候获取this.arr[0]也拿不到,是undefined,但是处理以后的_ob_:Observer,是不是枚举性就被破坏了。挖个坑,希望有大佬能来解惑,@&@

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值