英文:
How could i cancel any current await .then((value){....}
问题
我正在将Firestore用作我的应用程序的后端。
在我的应用程序中,用户可以进行注册,然后使用Firabese auth登录,就像任何其他应用程序一样。此外,如果他们有多个帐户,他们还可以切换到其他帐户。
在我的应用程序中,我有很多.get().then((value){....}
,如下所示:
FirebaseFirestore.instance.collection('users')
.limit(20)
.get(const GetOptions(source: Source.server)).then((value){
// 这里我使用一些任务来初始化一些全局变量,就像下面这样
// myGlobalVariable = value.get('name');
});
Firestore非常强大且快速,它可能需要一秒钟才能执行完.get()
函数内部的操作。
但在经过数月的测试后,我注意到有时需要5-8秒才能完成.get()
,当然这是因为用户端的一些慢速连接或其他原因。老实说,这种情况很少发生。但这让我担心的原因如下:
-
用户使用"帐户1"登录。
-
用户有一些
.get().then((value){myGlobalVariable = value.get('name');}
方法(由于某种原因发生了延迟)。 -
在
.get().then((value){myGlobalVariable = value.get('name');}
完成之前,用户切换到"帐户2"。 -
在用户成功切换到"帐户2"后,
.get().then((value){myGlobalVariable = value.get('name');}
成功完成。
这里发生了一些灾难,因为myGlobalVariable
具有来自第一个旧帐户的旧值。
实际上,这只是一个简单的例子。我有很多全局变量以及.then((value){....}
内部的一些任务,每个.then((value){....}
仅依赖于当前帐户。
我该如何确保在用户切换到另一个帐户之前取消整个当前未完成的.then((value){....}
,或者至少有什么最好的方法来避免这种情况发生?
英文:
i am using Firestore
as backend to my app
in my app users could signUp then login in using Firabese auth
like any app . also they can switch their accounts to another if they have many accounts.
in my app i have many .get().then((value){....}
like following ..
FirebaseFirestore.instance.collection('users')
.limit(20)
.get(const GetOptions(source: Source.server)).then((value){
// here i am using some tasks to init some global variables like following
// myGlobalVariable = value.get('name');
});
Firstore is awesome and fast and it take maybe a second to after .get() function and run what inside .then((value){....}
but after many tests in months work. i noticed sometimes there is 5-8 sec to finish from .get() and this of course because some slow connection of the users side or any reason else . To be honest, this rarely happens . But this keeps worrying me because of the following
1- user login in using account 1
2- user have some .get().then((value){myGlobalVariable = value.get('name');}
methods (Some delay happened for some reason)
3- before .get().then((value){myGlobalVariable = value.get('name');}
is done, user switch his account toaccount 2
4- .get().then((value){myGlobalVariable = value.get('name');}
successfully done after user successfully done log in account 2
here is some disaster happened . because myGlobalVariable
has old value from first old account .
in the fact it is just simple example . i have lots of global variables and some tasks within .then((value){....}
that per .then((value){....}
depends only in current account
How could i make sure and cancel the whole current pending `.then((value){....} before user switch to another account .
or at least what is the best way to avoid this !
答案1
得分: 0
- 将当前用户的 UID 传递给启动从Firestore读取用户数据的函数。
- 一旦
then
回调触发,添加一个检查,确保当前的 UID 仍然与调用时相同。
英文:
You could:
- Pass the current user's UID to the function that starts reading the user's data from Firestore.
- Once then
then
callback fires add a check that the current UID is still the same as what you were called with.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论