在AsyncStorage的文档中,我看到存在方法flushGetRequests
。 https://facebook.github.io/react-native/docs/asyncstorage#flushgetrequests
为什么会存在这种情况?何时应该使用它?
我已经在Async Storage的repo中发布了这个,但是在这里做,以备将来参考。
我恐怕我不知道这里的设计过程背后的确切想法,但无论如何让我试着去做。
我相信flushGetRequest
是为了优化本机数据调用而实现的,特别是在使用回调时。就像我们所知道的那样,访问外部资源(如DB,读取文件)可能“很昂贵”,因此Async Storage背后的开发人员试图尽可能提高性能。
从实现中,您可以注意到面向用户的.multiGet
方法实际上并没有直接在本机端调用.multiGet
。除了收集请求并在内部存储它(同样,在途中删除重复密钥),它还会检查是否已设置this._immediate
。
如果已设置,则只继续存储密钥/请求。
如果它没有设置,它会用setImmediate
调用触发flushGetRequests
。
From React Native docs,你可以阅读
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'))
}
每次调用DB / File系统在这里都是非常低效的。相反,.multiGet
收集所有这些信息,并在一次调用中执行getData
后将其发送到本机端。
您不必自己调用flushGetRequests
- 除非您按顺序调用多个getItem
/ multiGet
,而不是异步调用(使用promises),其中您需要通过一次调用生成另一个调用的结果(一个基于前一个调用)。
我希望这能以某种方式为您提供您正在寻找的答案。
谢谢。