何时在反应原生的AsyncStorage中使用flushGetRequests?

问题描述 投票:2回答:1

在AsyncStorage的文档中,我看到存在方法flushGetRequestshttps://facebook.github.io/react-native/docs/asyncstorage#flushgetrequests

为什么会存在这种情况?何时应该使用它?

react-native flush asyncstorage
1个回答
1
投票

我已经在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),其中您需要通过一次调用生成另一个调用的结果(一个基于前一个调用)。

我希望这能以某种方式为您提供您正在寻找的答案。

谢谢。

© www.soinside.com 2019 - 2024. All rights reserved.