如果您有一系列期货(取自Dart教程)
expensiveA().then((aValue) => expensiveB())
.then((bValue) => expensiveC())
.then((cValue) => doSomethingWith(cValue));
什么是正确的" Dart"取消这种链条的方式?例如,这个长链可能已经开始了一段时间,如果用户采取的行动使最终结果失效,你希望能够取消它。
可以使用expensiveA
,expensiveB
,expensiveC
和doSomethingWith
的代码检查变量值,并在值具有特定值时抛出错误。
但有没有一种杀死期货链的通用方法?
dart教程给出了如何连结期货的例子:https://www.dartlang.org/docs/tutorials/futures/#calling-multiple-funcs
有一些问题是(imho)部分回答了如何取消未来:is there any way to cancel a dart Future?
答案 0 :(得分:3)
没有。没有办法取消这样的链条。
有很多方法可以模拟可取消的未来:
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);
设置someBool
后,未来链将被有效取消,因为完成者的未来永远不会完成。
注意:cancelIfSomeBoolIsSet
在我的示例中采用了一个arg函数(与初始帖子中的0-arg函数相反)。修改代码将是微不足道的。