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

标签 asynchronous dart async-await flutter

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

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

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/

相关文章:

javascript - 没有 $.get 的 Backbone 渲染外部模板

Dart:为什么常量变量不能是实例变量?

c# - 从 HttpClient SendAsync 请求获取响应时出现无法解释的超时和延迟

c# - 为什么 await MethodName 的工作方式与 await Task.Run 不同?

javascript - C# 等线程语言上的线程与异步?

javascript - 如何使用 promise、.then()、.catch() 多次尝试异步函数

flutter - 是否有任何选项可以在 flutter fl_charts 中指定 x 轴和 y 轴上的值之间的间隔?

c# - 通用 FromEvent 方法

database - 服务器分页 : Typescript Save GET method data to number

flutter - 重新启动设备后在flutter中调用方法