打断Dart期货连锁的最佳方式?

时间:2014-01-03 20:21:50

标签: dart future

如果您有一系列期货(取自Dart教程)

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

什么是正确的" Dart"取消这种链条的方式?例如,这个长链可能已经开始了一段时间,如果用户采取的行动使最终结果失效,你希望能够取消它。

可以使用expensiveAexpensiveBexpensiveCdoSomethingWith的代码检查变量值,并在值具有特定值时抛出错误。

但有没有一种杀死期货链的通用方法?

参考文献:

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

有一些问题是(imho)部分回答了如何取消未来:is there any way to cancel a dart Future?

1 个答案:

答案 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函数相反)。修改代码将是微不足道的。