如果你有像(取自Dart教程)这样的期货链
expensiveA().then((aValue) => expensiveB())
.then((bValue) => expensiveC())
.then((cValue) => doSomethingWith(cValue));
取消这样一个链的正确“Dart”方法是什么?例如,这个长链可能已经在一段时间前启动,如果用户采取的行动使最终结果无用,您希望能够取消它。
可以让expensiveA
、expensiveB
、expensiveC
和doThingwith
的代码检查变量值并在值具有特定值的情况下抛出错误。
但是有没有一种通用的方法可以杀死一系列的期货?
dart教程给出了一个如何链式期货的例子:https://www.dartlang.org/docs/tutorials/futures/#calling-multiple-funcs
关于如何取消未来,有一个问题(恕我直言)得到了部分答案:有没有办法取消飞镖未来?
不,没有办法取消这样的链。
不过,有一些方法可以模拟可取消期货:
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循环来解包它。