gpt4 book ai didi

asynchronous - 根据另一个 Future 的结果创建 Future

转载 作者:IT王子 更新时间:2023-10-29 07:12:33 24 4
gpt4 key购买 nike

我有一个远程异步 firebase 函数“checkSubscription”,如果用户有有效订阅,它会返回“true”,或者或“N”,其中 N 表示用户用完之前剩余的积分数。

为了跟踪完成情况,我在类里面有这两个 futures:

Future<bool> hasSubscription;
Future<int> remaining;

假设这些数据类型不能改变。远程函数是这样调用的:

CloudFunctions.instance
.call(functionName: 'checkSubscription');

此函数返回 Future<dynamic>结果。

我正在努力处理为我的两个字段分配所需类型所需的 Future 逻辑。这是我想出的

Future<void> checkIfUserHasSubscription() async {
await Future < dynamic > remainingS = CloudFunctions.instance
.call(functionName: 'isValid');

if (remaining == "true")
hasSubscription = true;
else {
hasSubscription = false;
remaining = int.parse(remaining);
}
}

显然这行不通,因为我分配的是 bool 而不是 Future

有什么建议吗?

最佳答案

据我了解,您希望拥有两个稍后完成的 future 。当您调用检查功能时,这些 future 应该立即可用,但只有在您获得结果时才完成。

为此,您应该使用 Completer

我假设您只调用一次检查函数。如果不是,那么您应该在每次调用时在函数内部创建一个新的完成器,并将 future 存储在可变字段中。

Future<bool> _hasSubscription;
Future<int> _remaining;
Future<boo> get hasSubscription =>
_hasSubscription ?? throw StateError("Call checkIfUserHasSubscription first");
Future<int> get remaining =>
_remaining ?? throw StateError("Call checkIfUserHasSubscription first");
Future<void> checkIfUserHasSubscription() async {
// Maybe: if (hasSubscription != null) return;
var hasSubscriptionCompleter = Completer<bool>();
var remainingCompleter = Completer<int>();
_hasSubscription = hasSubscriptionCompleter.future;
_remaining = remainingCompleter.future;
var remainings = await
CloudFunctions.instance.call(functionName: 'isValid');
if (remaining == "true") {
hasSubscriptionCompleter.complete(true);
remainingCompleter.complete(0); // or never complete it.
} else {
hasSubscriptionCompleter.complete(false);
remainingCompleter.complete(int.parse(remaining));
}
}

关于asynchronous - 根据另一个 Future 的结果创建 Future,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54564241/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com