什么时候在 react-native 的 AsyncStorage 中使用 flushGetRequests?

When to use flushGetRequests in AsyncStorage in react-native?

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

为什么会有这个,我应该在什么时候使用它?

我已经在 Async Storage 的 repo 中发布了这个,但在这里发布,以供将来参考。


恐怕我不知道这里设计过程背后的确切想法,但无论如何让我尝试一下。

我相信 flushGetRequest 的实现是为了优化本地数据调用,特别是在使用回调时。 正如我们所知,访问外部资源(如数据库、读取文件)可能 "expensive",因此异步存储背后的开发人员试图使其尽可能高效。

从实现中,您可以注意到面向用户的 .multiGet 方法实际上并不是直接在本机端调用 .multiGet。除了收集请求并将其存储在内部(同时在途中删除重复密钥),它还会检查 this._immediate 是否已设置。

如果已设置,则继续存储 keys/requests。

如果未设置,它会触发 setImmediateflushGetRequests 调用。

From React Native docs 你可以阅读

setImmediate is executed at the end of the current JavaScript execution block, right before sending the batched response back to native.

什么意思 flushGetRequests 将在调用它的方法完成执行时被调用。

例如:

getData() {
    AsyncStorage.multiGet(['k1', 'k2'], () => console.log('done'))
}

flushGetRequestsgetData 完成执行后调用。

优化在哪里,你可能会问。 如果 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,而不是异步调用(使用承诺),您需要从一个呼叫进行另一个呼叫(一个基于前一个呼叫)。

我希望这能以某种方式为您提供所需的答案。

谢谢。