【发布时间】:2018-09-26 21:15:49
【问题描述】:
在 AsyncStorage 的文档中,我看到存在方法flushGetRequests。
https://facebook.github.io/react-native/docs/asyncstorage#flushgetrequests
为什么会存在,我应该什么时候使用它?
【问题讨论】:
标签: react-native flush asyncstorage
在 AsyncStorage 的文档中,我看到存在方法flushGetRequests。
https://facebook.github.io/react-native/docs/asyncstorage#flushgetrequests
为什么会存在,我应该什么时候使用它?
【问题讨论】:
标签: react-native flush asyncstorage
我已经在 Async Storage 的存储库中发布了此内容,但在此处发布,以供将来参考。
恐怕我不知道这里设计过程背后的确切想法,但无论如何让我尝试一下。
我相信flushGetRequest 的实现是为了优化对数据的本机调用,特别是在使用回调时。
正如我们所知,访问外部资源(如数据库、读取文件)可能是“昂贵的”,因此 Async Storage 背后的开发人员试图使其尽可能高性能。
从实现中,您可以注意到面向用户的.multiGet 方法实际上并没有直接在本机端调用.multiGet。除了收集请求并将其存储在内部(同时在途中删除 dup 密钥)之外,它还会检查 this._immediate 是否已设置。
如果已设置,则继续存储密钥/请求。
如果没有设置,它会触发 setImmediate 和 flushGetRequests 调用。
setImmediate 在当前 JavaScript 执行块的末尾执行,就在将批处理响应发送回本机之前。
这意味着flushGetRequests将在调用它的方法完成执行时被调用。
例如:
getData() {
AsyncStorage.multiGet(['k1', 'k2'], () => console.log('done'))
}
flushGetRequests 在getData 执行完毕后被调用。
您可能会问,优化在哪里。
如果getData 多次调用multiGet 怎么办?
getData() {
AsyncStorage.multiGet(['k1', 'k2'], () => console.log('done'))
AsyncStorage.multiGet(['k3', 'k4'], () => console.log('done1'))
AsyncStorage.multiGet(['k5', 'k6'], () => console.log('done2'))
}
在这里每次调用数据库/文件系统都会非常低效。因此,.multiGet 会在一次调用中收集所有这些信息并将其发送到本机端,一旦此执行为 getData。
您不必自己调用flushGetRequests - 除非您按顺序调用多个getItem/multiGet,而不是异步调用(使用承诺),您需要一个调用的结果来进行另一个调用(一个是基于上一个)。
我希望这能以某种方式为您提供所需的答案。
谢谢。
【讨论】: