一开始发现这个问题的时候,
图①↓
我先是把回调函数改了,然后出现新的状况,
图②↓
后面发现问题关键在我用了wx.getStorage
,如果改用wx.getStorageSync
,上面的情况就没有再出现了。
还有,下面是在一个异步函数里面的语句,也出现了类似的情况:
图③↓
找了关于js的异步的资料,重新看了这两个问题(不知道有没有理解对):
图①的wx.getStorage
是异步获取缓存,调用它的时候几乎同时会继续执行下面的语句,而执行下面语句时wx.getStorage
还没有执行成功,也就没有执行成功回调函数,所以结果是song is not defined
。
图②和图③的问题很相似,先打印的this.data
的song非空但后打印的this.data.song
是空,this.backgroundAudioManager
也同样的情况。
查到资料有说,在某些情况下,console.log
并不会直接输出内容(尤其是在输出对象的时候)。浏览器在后台异步处理控制台I/O能够提高性能,因此,在看到输出时,很有可能已经执行了其他语句。
根据这个资料,大概可以这样解释出现的现象:
图②图③的第一个console.log
打印的是对象,浏览器后台进行异步处理,这个过程中前面的(指图②,wx.getStorage
执行完成,并赋给data的song)或者后面的语句(指图③,src赋值)完成赋值,显示非空,第二个就直接打印,则显示为空。
如果我理解不对,请指出来,谢谢!