#javascript #firebase #google-cloud-firestore #promise #google-cloud-functions
#javascript #firebase #google-cloud-firestore #обещание #google-cloud-функции
Вопрос:
Я использую вызываемую облачную функцию для создания нового пользователя. Для этого пользователя создается несколько документов в облачном Firestore.
Я не хочу хранить только части данных, если одно обещание (сбой при создании документа), но полностью отменяет регистрацию, поэтому я использую Promise.all(documentCreationPromisses)
Итак, мой вопрос в том, возможно ли, что некоторые документы созданы, а другие нет, хотя я использую Promise.all() ?
Комментарии:
1. Да, потому что вы все равно создаете их все сразу.
Promise.all
вернет отклоненное обещание, если одна из операций завершится неудачно, но это не меняет того факта, что все операции выполняются (успешно или нет). Было бы лучше использоватьallSettled
вместо этого, а затем вы бы проверили, все ли они были успешными или нет — это не так, вы бы пошли и удалили документы, которые были успешно загружены, чтобы отменить частичную загрузку. (Причина, по которой этого будет недостаточно для выполнения при сбоеPromise.all
, заключается в том, что вы можете получить ошибку до завершения загрузки некоторых других документов.)
Ответ №1:
Promise.all()
возвращает обещание, сообщающее, удалось ли выполнить все другие обещания или какое-либо из них не удалось. Это, безусловно, может разрешиться с частичным набором успехов, и произошел сбой, вам нужно будет проверить каждое отдельное обещание, чтобы выяснить, какие из них были успешными или неудачными.
Если вы изменяете кучу документов в Firestore, и вам требуется, чтобы все изменения либо полностью завершились успешно, либо ничего не произошло (полный откат), тогда вам следует использовать пакетную запись или транзакцию. При пакетной записи и транзакциях все должно завершиться успешно, иначе весь пакет завершится неудачей. Единственное возвращенное обещание из этого пакета расскажет вам, что произошло.