Когда использовать flushGetRequests в AsyncStorage в реактивном? - PullRequest
0 голосов
/ 27 сентября 2018

В документации AsyncStorage я видел, что существует метод flushGetRequests.https://facebook.github.io/react-native/docs/asyncstorage#flushgetrequests

Почему это существует и когда я должен его использовать?

1 Ответ

0 голосов
/ 04 апреля 2019

Я уже разместил это в репозитории Async Storage, но делаю это здесь, для будущих ссылок.


Боюсь, я не знаю точную мысль, стоящую здесь за процессом проектирования, но позвольтея все равно пытаюсь это сделать.

Я полагаю, flushGetRequest был реализован для оптимизации собственных вызовов данных, особенно при использовании обратных вызовов.Как мы знаем, доступ к внешним ресурсам (таким как БД, чтение файлов) может быть «дорогостоящим», поэтому разработчики из Async Storage пытались сделать его максимально быстрым.

Из реализации вы можете заметить, что пользовательСтолкновение с .multiGet методом на самом деле не вызывает .multiGet непосредственно на нативной стороне.Помимо сбора запроса и его внутреннего хранения (а также удаления дублирующих ключей в пути), он проверяет, установлен ли this._immediate.

Если он задан, он просто продолжает хранить ключи / запросы.

если он не установлен, он запускает setImmediate с вызовом flushGetRequests.

Из React Native docs вы можете прочитать, что

setImmediate выполняется в конце текущего блока выполнения JavaScript, прямо перед отправкой пакетного ответа обратно в native.

Что означает, что flushGetRequests будет вызван, когда метод, вызывающий его, завершитсяexecuting.

Например:

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 последовательно, а не асинхронно (с помощью обещаний), когда вам нужен результат одного вызова для выполнения другого(один основан на предыдущем).

Я надеюсь, что это как-то даст вам ответ, который вы ищете.

спасибо.

...