Firestore Offline Cache & Promises - PullRequest
       30

Firestore Offline Cache & Promises

0 голосов
/ 13 сентября 2018

Этот вопрос является продолжением Автономный кэш Firestore . Я прочитал автономный кеш документация , но смущен одним моментом.

Один комментатор ответил на предыдущий вопрос (~ год назад):

Ваш код Android, который взаимодействует с базой данных, будет таким же подключены вы или нет, так как SDK просто работает одинаково. "

В документации API для метода set DocumentReference я только что заметил:

Возвращает non-null Promise containing void Обещание, которое разрешается один раз данные были успешно записаны в бэкэнд. ( Обратите внимание, что это не разрешится, пока вы не в сети ).

Акцент мой. Разве этот бит в документации не говорит о том, что код не будет вести себя так же, или я что-то упустил? Если я жду разрешения функции .set (), прежде чем разрешить какое-либо взаимодействие с пользователем, из этого бита будет звучать так, будто мне нужно настроить код для автономного случая иначе, чем обычно.

Метод добавления CollectionReference беспокоит меня немного больше. Он не имеет точно такой же ноты, но говорит (выделение мое):

Обещание, которое разрешается с помощью DocumentReference, указывающего на вновь созданный документ после его записи в серверную часть .

Это немного более расплывчато, так как не уверен, является ли "backend" в данном случае надмножеством "cache" и "server" или он предназначен для обозначения только сервера. Если это не решит, это будет означать, что следующее не будет работать, правильно?

return new Promise((resolve, reject) => {
  let ref = firestore.collection(path)
  ref.add(data)
  .then(doc => {
    resolve({ id: doc.id, data: data })
  })
  ...
})

Это значит, что .add () не разрешится, .then () не запустится, и у меня не будет доступа к id только что добавленного документа. Надеюсь, я что-то неправильно понял, и мой код может продолжать работать как в оперативном, так и в автономном режиме.

1 Ответ

0 голосов
/ 13 сентября 2018

У вас есть две проблемы, которые на самом деле не связаны. Я объясню оба из них отдельно.

По большей части разработчикам, как правило, все равно, разрешается ли обещание обновления документа или нет. Это почти всегда "огонь и забудь". Что выиграет приложение, узнав, что обновление попадет на сервер, если приложение ведет себя одинаково независимо? Локальный кэш обновлен, и все последующие запросы будут показывать, что документ обновлен, даже если обновление еще не было синхронизировано с сервером.

Основным исключением является транзакция. Транзакции требуют, чтобы сервер был подключен к сети, потому что между клиентом и сервером необходимо совершить циклические обходы, чтобы гарантировать, что обновление было атомарным. Транзакции просто не работают в автономном режиме. Если вам нужно знать, сработала ли транзакция, вам нужно быть в сети. В отличие от обычной записи документов, транзакции не сохраняются в локальном кэше. Если приложение будет завершено до завершения транзакции на сервере, транзакция будет потеряна.


Ваше второе беспокойство касается новых добавленных документов, в которых идентификатор документа не определен во время обновления. Это правда, что add() возвращает обещание, которое разрешается только при наличии нового документа на сервере. Вы не можете знать идентификатор документа, пока обещание не предоставит вам DocumentReference нового документа.

Если это поведение не работает для вас, вы можете сгенерировать новый идентификатор для документа, просто вызвав doc() без аргументов вместо add(). doc() немедленно возвращает DocumentReference нового (будущего) документа, который не был написан (пока вы не решите его написать). В обоих случаях doc() и add() эти объекты DocumentReference содержат уникальные идентификаторы , сгенерированные на клиенте . Разница в том, что с doc() вы можете сразу использовать идентификатор, потому что вы сразу получаете DocumentReference. С add() вы не можете, потому что DocumentReference не предоставляется, пока не будет выполнено обещание. Если вам нужен новый идентификатор документа прямо сейчас , даже в автономном режиме, используйте doc() вместо add(). Затем вы можете использовать возвращенный DocumentReference, чтобы создать документ в автономном режиме, сохранить в локальном кэше и синхронизировать позже. Затем обновление вернет обещание, которое разрешается, когда документ действительно написан.

...