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