如何正确地将期货与Flatter上的firebase交易关联起来?
这是我的密码。成功返回如何正确地将期货与Flatter上的firebase交易关联起来?,firebase,google-cloud-firestore,flutter,Firebase,Google Cloud Firestore,Flutter,这是我的密码。成功返回false,因为文档长度为0 var sucess = await Firestore.instance.runTransaction((transaction) async { await transaction.set(userReference, userMap); }).then((_) { return Firestore.instance.collection(CollectionName.user).where(Fireb
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((事务)→ Future transactionHandler,{持续时间超时:常量持续时间(秒:5)})→ 未来
在事务完成后调用下一个future,或者在事务失败时出错的正确方法是什么
一个要考虑的问题是,当我用断点对用户进行查询时,就有一个延迟,我正确地得到用户。
此外,用户已正确写入我的数据库 编辑:我也试过了var sucess = await Firestore.instance.runTransaction((transaction) async {
return transaction.set(userReference, userMap);
})
但它不起作用。我认为它与事务中嵌套的
wait
有关,这也解释了调试期间看到的竞争条件
在runTransaction
中使用此事务处理程序时会发生什么情况
(transaction) {
return transaction.set(userReference, userMap);
}
你把未来和等待混为一谈。尝试删除Firestore.instance.runTransaction之前的第一个wait
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 transaction.set(userReference,userMap)中删除await
因为它会立即返回,并且有一个未来,但不是100%确定相同,所以已经尝试过了。经过一番思考,竞争条件似乎与firebase server有关,事务在客户端结束,并立即启动新请求以获取文档,但firebase server也需要时间来处理事务。这只是我目前的猜测。我刚刚阅读了文档,当事务完成时,它是确定的,并且数据被写入。您是否尝试过不使事务处理程序异步,而只是返回transaction.set
?在您的编辑中,处理程序仍然是异步的。我还没有尝试过,但据我从文档中记得的,异步函数不再作为微事务生成。我将尝试这样做