最近发现在写的实验系统有个 bug,首屏打开的实验,总是会丢失一些物件,一开始还以为是打开太快,没画完,调试了一会发现丢失的物件都是图形精灵,再摸索一会发现 texture 的 load 方法是异步的,每次打印都在调用他的函数之后执行。 但是问题来了打印出来明明是有数据的,它长这样:

{}
key1: value
key2: value
……

可见对象显示是空的,但是下拉会发现就是有数据,按理说若是异步的,一开始应该打印的是空对象,有了数据之后才会显示数据的,这种不伦不类的是什么鬼,用又用不到,又显示出来有。这里可能就得讲讲数据类型了,对象是引用类型,对象的每次复制都只是创建一个指针,指向原来的内存而已,所以我在异步里面赋值给了 textures,在异步函数外面返回,实际上是先返回了空,函数执行完,再执行异步函数时,又给原来的内存了这些对象,所以就会出现上面的打印结果。

知道了为什么会打印这种东东,我就确定就是异步的问题了,那么解决方法就简单了,处理异步无非就几种:callback、Promise、async/await,我选择了原始的 callback,因为这比较符合我的需求。