每次 parseInt ,就报错

从本地存储中拿到一个字符串,parseInt的时候,在微信小游戏编译环境下报这个错。

    var level = cc.sys.localStorage.getItem(0);
    com.sceneLevel = parseInt(level);

在cocoscreator里运行没问题。

改成 com.sceneLevel = parseInt(“1”); 微信里也没问题

如果用 level.toString() 。 在cocoscreator里没错,但是在微信里报错说没有toString()函数

没抓住重点,报错内容提示的是 read property 'json' of undefined ,说明就没有 key为 0存储的内容。
在cocos creator的编辑器模式或者web模式下,cc.sys.localStorage === localStorage,key为number是可以存储数据的,
而发布成微信小游戏,cc.sys.localStorage下的接口会更改成微信的API, cc.sys.localStorage.setItem == wx.setStorageSync,那么问题来了,微信的API中setStorage(key, any data), key是只能是字符串,所以你这样存储是失败的,你将cc.sys.localStorage.setItem(0, anyData)更改为cc.sys.localStorage.setItem("0", anyData)应该是可以了。

1赞

但是我把parse这句注释掉。就完全没问题
var level = cc.sys.localStorage.getItem(0);
//com.sceneLevel = parseInt(level);

看了下 callstack,应该是这个level 没有获的值。 然后导致 com.sceneLevel 没有值。
最后在后继代码里 有一个使用 sceneLevel 获的数据 aaa,用了 aaa.json。 结果aaa没有值。报了 json这个错。

追问一个。 如果是每次开程序,都要加载一个 级别。
那么首次启动的时候怎么处理? 我现在这么写的:
var temp = cc.sys.localStorage.getItem(“0”);
if(temp == null)
cc.sys.localStorage.setItem(“0”,“3”);

可以这样处理

但是这个在微信里就不好使。在 模拟器就可以

就是卡在这里。 首次启动,没有获的级别数,但是那个判断条件又不管用,没能设置进去。所以后面就取不出来了

解决了,用了 isObjectValid()

    var temp = cc.sys.localStorage.getItem("0");

    if(cc.sys.isObjectValid(temp) == false){
        cc.sys.localStorage.setItem("0","3");    // if local storage = null, set it to 1
        console.log("set level !! ");
    }

这里可能有问题,你这样判断

var temp = cc.sys.localStorage.getItem("0");
if(!temp)
cc.sys.localStorage.setItem("0","3");

因为temp可是个空字符串