微信小游戏开发:后端篇
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

读写本地文件,实现数据服务模块

仍然在data_service.js文件中添加新的功能实现,在原有代码的基础上进行修改,具体如代码清单1-9所示。

代码清单1-9 读写本地文件以实现数据服务模块

看一下这个文件发生了什么。

❑第5行在当前文件作用域下声明了一个常量HISTORY_FILEPATH,代表本地的用户文件名称。

❑DataServiceViaFileSystemManager是新增的、基于文件管理器实现的本地数据服务类,它的三个方法的功能与SyncDataService已经实现的同名方法是一致的。

❑第12行声明了一个名称为#filePath的私有getter(访问器属性),在这里声明是为了在下面三个方法中统一调用(第25行、第38行和第51行)。

❑第13行中的wx.env.USER_DATA_PATH是微信预定义的,它代表当前用户文件的存储目录。这个目录是分小游戏产品、用户设置的,不同产品的不同用户不会发生相互覆盖的情况。

❑第15行中的#fsMgr是一个由wx.getFileSystemManager接口返回的文件管理器,是一个单例。

❑第26行、第40行使用工具方法promisify将异步接口转为同步接口进行调用。关于接口的参数可以参见微信小游戏官方文档。

❑第40行的代码在第一次执行时,会爆出一个“access:fail no such file or directory...”的异常,因为文件尚不存在,访问无效;这时候这行代码尾部添加的catch代码就发挥作用了,异常发生时不会影响程序的正常执行,只会将信息打印出来。分辨异常有没有影响程序的正常运行,可以看Console面板中错误信息的颜色:如果是红色,说明影响了;如果是灰色,一般没有影响。

❑第42行,在读取文件内容时,只有accessRes不为空对象时才会执行到这一行。如果文件不存在,accessRes指定为空,是执行不到这里的。

❑第26行中的#fsMgr.writeFile代表异步写入文件;第40行中的#fsMgr.access代表异步判断文件/目录是否存在;第42行中的#fsMgr.readFileSync代表同步读取文件内容;第52行中的#fsMgr.removeSavedFile代表异步移除已经保存在本地的文件。这些接口的作用和参数在官方文档中都有详细说明,如果不清楚可以查看官方文档。

好了,这个文件的代码看完了,但这里有一个问题:#fsMgr.writeFile和#fsMgr.access这两个方法都有一个同步版本,分别是#fsMgr.writeFileSync和#fsMgr.accessSync,既然有同步版本,为什么还要使用“异步转同步”技巧将其转换一下呢?直接使用同步版本的方法不是更方便吗?

这个问题先留给读者朋友思考,答案会在稍后的实践中慢慢浮出水面。现在我们看一下消费代码(测试本地读写文件的代码),如代码清单1-10所示。

代码清单1-10 测试本地读写文件的代码

上面的代码做了什么?

❑第21~24行是新增的测试代码。

❑第25行用于清除本地文件数据,但这种清除方式是无效的,稍后我们会看到原因。除了这种清除方式,还有一种更方便的清除方式,那就是在微信开发者工具的工具栏中依次选择“清缓存”→“清除文件缓存”选项。

重新编译测试,在Console面板中可以看到程序运行的打印输出没有问题,如图1-5所示。

图1-5 Console面板输出本地游戏数据

对于使用FileSystemManager的旧代码,可能会出现这样的错误:

本地用户目录是从基础库1.7.0版本开始新增的概念,在使用本地文件读写接口时,要注意检查本地所用的基础库版本是否为1.7.0或以上版本。

对于每个小游戏,微信小游戏运行环境专门提供了一个用户文件目录给开发者,开发者对这个目录有完全自由的读写权限。通过wx.env.USER_DATA_PATH可以获取这个目录路径。wx.env代表小游戏/小程序的运行时环境对象,在wx.env上定义的都是有关运行时环境的环境变量。