当前位置: 首页 > 知识库问答 >
问题:

打断达特期货链的最好方法?

郑功
2023-03-14

如果你有像(取自Dart教程)这样的期货链

expensiveA().then((aValue) => expensiveB()) 
            .then((bValue) => expensiveC()) 
            .then((cValue) => doSomethingWith(cValue));

取消这样一个链的正确“Dart”方法是什么?例如,这个长链可能已经在一段时间前启动,如果用户采取的行动使最终结果无用,您希望能够取消它。

可以让expensiveAexpensiveBexpensiveCdoThingwith的代码检查变量值并在值具有特定值的情况下抛出错误。

但是有没有一种通用的方法可以杀死一系列的期货?

dart教程给出了一个如何链式期货的例子:https://www.dartlang.org/docs/tutorials/futures/#calling-multiple-funcs

关于如何取消未来,有一个问题(恕我直言)得到了部分答案:有没有办法取消飞镖未来?

共有1个答案

桑鸿志
2023-03-14

不,没有办法取消这样的链。

不过,有一些方法可以模拟可取消期货:

var someBool;

cancelIfSomeBoolIsSet(fun(x)) {
  return (x) {
    if (someBool) return new Completer().future;
    return fun(x);
  };
}

expensiveA().then(cancelIfSomeBoolIsSet(expensiveB))
            .then(cancelIfSomeBoolIsSet(expensiveC))
            .then(doSomethingWithCValue);

一旦设置了一些Bool,未来链就会被有效地取消,因为完成者的未来永远不会完成。

注意:在我的示例中,在我的示例中使用了一个1-arg函数(与初始帖子中的0-arg函数相反)。调整代码是微不足道的。

 类似资料:
  • 我通过在对象列表上进行流式处理来调用异步客户端方法。该方法返回Future。 迭代调用后返回的Futures列表的最佳方法是什么(以便处理那些首先出现的Future)? 注意:异步客户端只返回Future而不是CompletableFuture。 代码如下:

  • 假设我有一个抽象的“生产者”实例: 我需要对它产生的每个(或一些)对象进行一些处理。所以,我做了类似的事情: …并以<code>Future[Seq[Future[T]]]结束。这没关系,但有点麻烦。我想摆脱外部的,只需要就可以了,但我想不出一个(非阻塞)转换,可以让我这样做。 有什么想法吗?

  • 问题内容: 我有一个需要很长时间(5-30分钟)才能完成的PHP脚本。以防万一,脚本正在使用curl从另一台服务器上刮取数据。这就是它花费这么长时间的原因。它必须等待每个页面加载,然后再处理并移至下一页。 我希望能够启动脚本并放任其完成,这将在数据库表中设置一个标志。 我需要知道的是如何能够在脚本完成运行之前结束http请求。另外,php脚本是做到这一点的最佳方法吗? 问题答案: 当然可以使用PH

  • 我正在使用: Scala 2.10 游戏2.1 目前,我正在使用 类,但我愿意尝试另一个 API。 我很难将多个期货的结果组合成一个列表[(String, String)]。 以下 方法成功地将单个 Future 的结果返回到 HTML 模板: 方法执行 Web 服务 API 调用并返回 Future[play.api.libs.ws.Response]。方法 向 HTML 模板返回 List[(

  • 我启动了几个异步进程,如果需要,这些进程反过来可以启动更多的进程(想想遍历目录结构或类似的东西)。每个进程都会返回一些东西,最后我想等待所有这些进程的完成,并安排一个函数来处理结果集合。 我的解决方案尝试使用可变的(我不断添加我生成的期货)和来安排一些函数在此缓冲区中列出的所有这些期货完成后运行。 我准备了一个简单的例子来说明这个问题: 它首先调度和期货,然后将在1秒后的分辨率中调度。本身将在2秒

  • 不允许使用任何导入。 输入: 所需输出: 我在找一个简洁的方法。我知道如何用多行for循环来解包它。