Как правильно связать фьючерсы с помощью Firebase на флаттер? - PullRequest
0 голосов
/ 05 июня 2018

Вот мой код.успех возвращается false, потому что длина документа равна 0.

   var sucess = await Firestore.instance.runTransaction((transaction) async {
      await transaction.set(userReference, userMap);
    }).then((_) {
      return Firestore.instance.collection(CollectionName.user).where(FirebaseUserField.uid, isEqualTo: userMap["uid"]).getDocuments();
    }).then((querySnapshot) {
      if (querySnapshot.documents.length == 0) {
        return false;
      }
      return true;
    }).catchError((e) {
      print(e);
      return false;
    });

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

Из документов Firestore я вижу, что обработчик разрешает, я думаю, возвращаемое значение транзакции, но экземпляр, который вызываеттранзакция преобразуется в пустую карту.

runTransaction((Transaction) → Future<dynamic> transactionHandler, {Duration timeout: const Duration(seconds: 5)}) → Future<Map<String, dynamic>>

Как правильно вызвать следующее будущее после завершения транзакции или перейти к ошибке в случае сбоя.

Следует учитывать, что при отладке с точкой останова, когда я запрашиваю пользователя, поэтому возникает задержка, я правильно получаю пользователя.

Также пользователь правильно записывается в мою базу данных.

РЕДАКТИРОВАТЬ: Я также пытался

var sucess = await Firestore.instance.runTransaction((transaction) async {
      return transaction.set(userReference, userMap);
    })

, но это не сработало.

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Вы смешиваете фьючерсы с ожиданием.Попробуйте удалить первое ожидание до Firestore.instance.runTransaction

var sucess = Firestore.instance.runTransaction((transaction) async {
      await transaction.set(userReference, userMap);
    }).then((_) {
      return Firestore.instance.collection(CollectionName.user).where(FirebaseUserField.uid, isEqualTo: userMap["uid"]).getDocuments();
    }).then((querySnapshot) {
      if (querySnapshot.documents.length == 0) {
        return false;
      }
      return true;
    }).catchError((e) {
      print(e);
      return false;
    });

Возможно, вам также понадобится удалить await из await transaction.set(userReference, userMap);, поскольку он сразу же вернется с будущим, но не на 100% уверен

0 голосов
/ 05 июня 2018

Я думаю, что это как-то связано с вложенным await внутри вашей транзакции, что также объясняет состояние гонки, которое вы видите во время отладки.

Что происходит, когда вы используете этот обработчик транзакций в runTransaction?

(transaction) {
  return transaction.set(userReference, userMap);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...