首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使延迟的未来可以在Dart取消?

如何使延迟的未来可以在Dart取消?
EN

Stack Overflow用户
提问于 2021-02-26 05:29:44
回答 3查看 1.6K关注 0票数 5

让我们说,在Dart/Flutter中,您有以下代码:

代码语言:javascript
复制
void myOperation() {
  // could be anything
  print('you didn't cancel me!');
}

注意,操作本身不是异步的,并且是无效的--不返回任何内容。

我们希望在将来的某个时候执行它,但是我们也希望能够取消它(因为已经请求了一个新的操作来取代它)。

我一开始就是这么做的

代码语言:javascript
复制
Future.delayed(Duration(seconds: 2), myOperation())

..。但这不能取消。

你怎么能准确地安排“手术”,但也使它可以取消?

我在想..。我们可以这样修改代码:

代码语言:javascript
复制
Future.delayed(Duration(seconds: 2), () {
    if (youStillWantThisToExecute) {
        print('you didn't cancel me!');
    }
});

但这并不是很好,因为这取决于“全局”布尔值.因此,如果布尔值被转换为false,就不会完成任何操作,即使是最近请求的操作,这也是我们希望完成的操作。

如果有一种方法来创建任意数量的操作实例并逐个取消它们,将会更好.或者为每个操作分配一个唯一的id,而不是有一个布尔控件来控制是否执行.具有"mostRecentId“int或执行前检查的内容。

不管怎样..。

从名字上看,CancelableOperation似乎很有前途。

因此,我查看了它的文档:

CancelableOperation.fromFuture(未来内部,{FutureOr onCancel()})创建一个CancelableOperation包装内部。..。工厂

但老实说,这只会让我可怜的脑袋疼得要命。

我参考过其他文章、问题和答案,但它们都是特定(复杂)上下文的一部分,在任何地方都找不到一个非常简单的例子。

是否有办法通过将延迟的未来包装在其他类中来取消它?

能否请更有经验的人提供至少一个在DartPad中编译的简单、完整、可验证的示例?

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-02-28 06:45:49

不能取消现有的Future。如果你这样做了:

代码语言:javascript
复制
Future.delayed(
  Duration(seconds: 2),
  () {
    print('hello');
  },
);

只要进程运行(并且正在处理其事件队列)至少2秒,Future最终将执行并打印'hello'

充其量,您可以使Future的一个完成回调提前触发,这样调用方就可以将操作视为已取消或失败,这就是CancelableOperation等人所做的。

编辑:

根据您更新的问题(现在专门询问延迟的Future),您应该考虑使用可取消的Timer。(但是,与Future不同,调用方不能直接等待Timer。如果这对你很重要,你需要创建一个Completer,让调用者在CompleterFuture上等待,让Timer的回调完成它。)

票数 1
EN

Stack Overflow用户

发布于 2021-03-02 06:24:46

使用计时器:

代码语言:javascript
复制
var t = Timer(Duration(seconds: 400), () async {
   client.close(force: true);
});
...
t.cancel();
票数 3
EN

Stack Overflow用户

发布于 2021-02-26 06:29:35

即使取消,使用CancalableOperation也不会阻止print('hello');的执行。它所做的是取消(放弃)结果(在您的情况下无效)。我将使用CancalableOperationCancalableFuture给出两个例子。

CancelableOperation实例

代码语言:javascript
复制
    final delayedFuture = Future.delayed(
      Duration(seconds: 2),
      () {
        return 'hello';
      },
    );

    final cancellableOperation = CancelableOperation.fromFuture(
      delayedFuture,
      onCancel: () => {print('onCancel')},
    );

    cancellableOperation.value.then((value) => {
          // Handle the future completion here
          print('then: $value'),
        });
    cancellableOperation.value.whenComplete(() => {
          print('onDone'),
        });
    cancellableOperation.cancel(); // <- commment this if you want to complete

CancelableFuture实例

代码语言:javascript
复制
    final delayedFuture = ...;

    final cancalableFuture = CancelableFuture<String>(
      future: delayedFuture,
      onComplete: (result) {
        // Use the result from the future to do stuff
        print(result);
      },
    );
    cancalableFuture.cancel(); // <- commment this if you want to complete

以及CancelableFuture的实现

代码语言:javascript
复制
class CancelableFuture<T> {
  bool _cancelled = false;
  CancelableFuture({
    @required Future<dynamic> future,
    @required void Function(T) onComplete,
  }) {
    future.then((value) {
      if (!_cancelled) onComplete(value);
    });
  }
  void cancel() {
    _cancelled = true;
  }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66380613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档