【问题标题】:When to use flushGetRequests in AsyncStorage in react-native?什么时候在 react-native 的 AsyncStorage 中使用 flushGetRequests?
【发布时间】:2018-09-26 21:15:49
【问题描述】:

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

为什么会存在,我应该什么时候使用它?

【问题讨论】:

    标签: react-native flush asyncstorage


    【解决方案1】:

    我已经在 Async Storage 的存储库中发布了此内容,但在此处发布,以供将来参考。


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

    我相信flushGetRequest 的实现是为了优化对数据的本机调用,特别是在使用回调时。 正如我们所知,访问外部资源(如数据库、读取文件)可能是“昂贵的”,因此 Async Storage 背后的开发人员试图使其尽可能高性能。

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

    如果已设置,则继续存储密钥/请求。

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

    From React Native docs你可以读到

    setImmediate 在当前 JavaScript 执行块的末尾执行,就在将批处理响应发送回本机之前。

    这意味着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'))
    }
    

    在这里每次调用数据库/文件系统都会非常低效。因此,.multiGet 会在一次调用中收集所有这些信息并将其发送到本机端,一旦此执行为 getData

    您不必自己调用flushGetRequests - 除非您按顺序调用多个getItem/multiGet,而不是异步调用(使用承诺),您需要一个调用的结果来进行另一个调用(一个是基于上一个)。

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

    谢谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-03
      • 1970-01-01
      • 2020-02-11
      • 1970-01-01
      • 2021-06-16
      • 2022-08-24
      相关资源
      最近更新 更多