我们在读取存档的时候,可能会遇到两种情况:
- 玩家是第一次玩我们的游戏,本身存档为空
- 玩家在游戏本来存在存档,但是由于读取的时候出现错误,导致读取的存档同样为空
以上两种情况读到的数据都为初始化的值,那么如何才能较为稳妥地拿到玩家的存档呢?
具体思路如下:
第一步,判断获取成功状态
我们可以根据获取的 DataStorageResult 的code值,判断此次获取是否成功,代码如下:
<span style="color:#494b4d"><span style="background-color:#ffffff"><span style="background-color:#272822"><span style="color:#f8f8f2"><code class="language-typescript">
<span style="color:#66d9ef">if</span> <span style="color:#f8f8f2">(</span>SystemUtil<span style="color:#f8f8f2">.</span><span style="color:#e6db74">isServer</span><span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2">{</span>
DataStorage<span style="color:#f8f8f2">.</span><span style="color:#e6db74">asyncGetData</span><span style="color:#f8f8f2">(</span><span style="color:#a6e22e">"dataKey"</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">.</span><span style="color:#e6db74">then</span><span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">(</span>result<span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2">=></span> <span style="color:#f8f8f2">{</span>
<span style="color:#8292a2">//需要判断数据储存获取情况为Success,并且保险起见,判断一下获取的data不为null</span>
<span style="color:#66d9ef">if</span> <span style="color:#f8f8f2">(</span>result<span style="color:#f8f8f2">.</span>code <span style="color:#f8f8f2">===</span> DataStorageResultCode<span style="color:#f8f8f2">.</span>Success <span style="color:#f8f8f2">&&</span> result<span style="color:#f8f8f2">.</span>data <span style="color:#f8f8f2">!=</span> <span style="color:#66d9ef">null</span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2">{</span>
<span style="color:#8292a2">//此时可确保result.data正常获取</span>
<span style="color:#66d9ef">let</span> data <span style="color:#f8f8f2">=</span> result<span style="color:#f8f8f2">.</span>data
<span style="color:#f8f8f2">}</span>
<span style="color:#f8f8f2">}</span><span style="color:#f8f8f2">)</span>
<span style="color:#f8f8f2">}</span>
</code></span></span></span></span>
TypeScript
复制
第二步,判断获取失败的原因,并且尝试再次获取
接下来需要用code值判断获取失败的原因,并且分情况进行重新获取存档,代码如下:
<span style="color:#494b4d"><span style="background-color:#ffffff"><span style="background-color:#272822"><span style="color:#f8f8f2"><code class="language-typescript"><span style="color:#66d9ef">private</span> <span style="color:#e6db74">getData</span><span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2">{</span>
<span style="color:#66d9ef">if</span> <span style="color:#f8f8f2">(</span>SystemUtil<span style="color:#f8f8f2">.</span><span style="color:#e6db74">isServer</span><span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2">{</span>
DataStorage<span style="color:#f8f8f2">.</span><span style="color:#e6db74">asyncGetData</span><span style="color:#f8f8f2">(</span><span style="color:#a6e22e">"dataKey"</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">.</span><span style="color:#e6db74">then</span><span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">(</span>result<span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2">=></span> <span style="color:#f8f8f2">{</span>
<span style="color:#8292a2">//需要判断数据储存获取情况为Success,并且保险起见,判断一下获取的data不为null</span>
<span style="color:#66d9ef">if</span> <span style="color:#f8f8f2">(</span>result<span style="color:#f8f8f2">.</span>code <span style="color:#f8f8f2">===</span> DataStorageResultCode<span style="color:#f8f8f2">.</span>Success <span style="color:#f8f8f2">&&</span> result<span style="color:#f8f8f2">.</span>data <span style="color:#f8f8f2">!=</span> <span style="color:#66d9ef">null</span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2">{</span>
<span style="color:#8292a2">//此时可确保result.data正常获取</span>
<span style="color:#66d9ef">let</span> data <span style="color:#f8f8f2">=</span> result<span style="color:#f8f8f2">.</span>data
<span style="color:#f8f8f2">}</span>
<span style="color:#8292a2">//若获取情况为请求超时或未知错误,可以直接再次发送拿数据的请求</span>
<span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> <span style="color:#f8f8f2">(</span>result<span style="color:#f8f8f2">.</span>code <span style="color:#f8f8f2">===</span> DataStorageResultCode<span style="color:#f8f8f2">.</span>TimeOut <span style="color:#f8f8f2">||</span> result<span style="color:#f8f8f2">.</span>code <span style="color:#f8f8f2">===</span> DataStorageResultCode<span style="color:#f8f8f2">.</span>Failure<span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2">{</span>
<span style="color:#66d9ef">this</span><span style="color:#f8f8f2">.</span><span style="color:#e6db74">getData</span><span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span>
<span style="color:#f8f8f2">}</span>
<span style="color:#8292a2">//若获取情况为请求频率过高,需要等待一段时间再次发送拿数据请求</span>
<span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> <span style="color:#f8f8f2">(</span>result<span style="color:#f8f8f2">.</span>code <span style="color:#f8f8f2">===</span> DataStorageResultCode<span style="color:#f8f8f2">.</span>RequestTooFrequent<span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2">{</span>
<span style="color:#e6db74">setTimeout</span><span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2">=></span> <span style="color:#f8f8f2">{</span>
<span style="color:#66d9ef">this</span><span style="color:#f8f8f2">.</span><span style="color:#e6db74">getData</span><span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span>
<span style="color:#f8f8f2">}</span><span style="color:#f8f8f2">,</span> <span style="color:#ae81ff">5000</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">;</span>
<span style="color:#f8f8f2">}</span>
<span style="color:#66d9ef">else</span> <span style="color:#f8f8f2">{</span>
<span style="color:#a6e22e">console</span><span style="color:#f8f8f2">.</span><span style="color:#e6db74">log</span><span style="color:#f8f8f2">(</span><span style="color:#a6e22e">"获取错误请检查代码逻辑,错误码"</span> <span style="color:#f8f8f2">+</span> result<span style="color:#f8f8f2">.</span>code<span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">;</span>
<span style="color:#f8f8f2">}</span>
<span style="color:#f8f8f2">}</span><span style="color:#f8f8f2">)</span>
<span style="color:#f8f8f2">}</span>
<span style="color:#f8f8f2">}</span>
</code></span></span></span></span>
TypeScript
复制
这样就可以保证有存档的玩家当出现拿取存档错误的时候无法进入游戏,而不是造成存档毁坏啦