У вас есть две проблемы, которые на самом деле не связаны. Я объясню оба из них отдельно.
По большей части разработчикам, как правило, все равно, разрешается ли обещание обновления документа или нет. Это почти всегда "огонь и забудь". Что выиграет приложение, узнав, что обновление попадет на сервер, если приложение ведет себя одинаково независимо? Локальный кэш обновлен, и все последующие запросы будут показывать, что документ обновлен, даже если обновление еще не было синхронизировано с сервером.
Основным исключением является транзакция. Транзакции требуют, чтобы сервер был подключен к сети, потому что между клиентом и сервером необходимо совершить циклические обходы, чтобы гарантировать, что обновление было атомарным. Транзакции просто не работают в автономном режиме. Если вам нужно знать, сработала ли транзакция, вам нужно быть в сети. В отличие от обычной записи документов, транзакции не сохраняются в локальном кэше. Если приложение будет завершено до завершения транзакции на сервере, транзакция будет потеряна.
Ваше второе беспокойство касается новых добавленных документов, в которых идентификатор документа не определен во время обновления. Это правда, что add()
возвращает обещание, которое разрешается только при наличии нового документа на сервере. Вы не можете знать идентификатор документа, пока обещание не предоставит вам DocumentReference
нового документа.
Если это поведение не работает для вас, вы можете сгенерировать новый идентификатор для документа, просто вызвав doc()
без аргументов вместо add()
. doc()
немедленно возвращает DocumentReference нового (будущего) документа, который не был написан (пока вы не решите его написать). В обоих случаях doc()
и add()
эти объекты DocumentReference содержат уникальные идентификаторы , сгенерированные на клиенте . Разница в том, что с doc()
вы можете сразу использовать идентификатор, потому что вы сразу получаете DocumentReference. С add()
вы не можете, потому что DocumentReference не предоставляется, пока не будет выполнено обещание. Если вам нужен новый идентификатор документа прямо сейчас , даже в автономном режиме, используйте doc()
вместо add()
. Затем вы можете использовать возвращенный DocumentReference, чтобы создать документ в автономном режиме, сохранить в локальном кэше и синхронизировать позже. Затем обновление вернет обещание, которое разрешается, когда документ действительно написан.