让我们说,在Dart/Flutter中,您有以下代码:
void myOperation() {
// could be anything
print('you didn't cancel me!');
}注意,操作本身不是异步的,并且是无效的--不返回任何内容。
我们希望在将来的某个时候执行它,但是我们也希望能够取消它(因为已经请求了一个新的操作来取代它)。
我一开始就是这么做的
Future.delayed(Duration(seconds: 2), myOperation())..。但这不能取消。
你怎么能准确地安排“手术”,但也使它可以取消?
我在想..。我们可以这样修改代码:
Future.delayed(Duration(seconds: 2), () {
if (youStillWantThisToExecute) {
print('you didn't cancel me!');
}
});但这并不是很好,因为这取决于“全局”布尔值.因此,如果布尔值被转换为false,就不会完成任何操作,即使是最近请求的操作,这也是我们希望完成的操作。
如果有一种方法来创建任意数量的操作实例并逐个取消它们,将会更好.或者为每个操作分配一个唯一的id,而不是有一个布尔控件来控制是否执行.具有"mostRecentId“int或执行前检查的内容。
不管怎样..。
从名字上看,CancelableOperation似乎很有前途。
因此,我查看了它的文档:
CancelableOperation.fromFuture(未来内部,{FutureOr onCancel()})创建一个CancelableOperation包装内部。..。工厂
但老实说,这只会让我可怜的脑袋疼得要命。
我参考过其他文章、问题和答案,但它们都是特定(复杂)上下文的一部分,在任何地方都找不到一个非常简单的例子。
是否有办法通过将延迟的未来包装在其他类中来取消它?
能否请更有经验的人提供至少一个在DartPad中编译的简单、完整、可验证的示例?
谢谢。
发布于 2021-02-28 06:45:49
不能取消现有的Future。如果你这样做了:
Future.delayed(
Duration(seconds: 2),
() {
print('hello');
},
);只要进程运行(并且正在处理其事件队列)至少2秒,Future最终将执行并打印'hello'。
充其量,您可以使Future的一个完成回调提前触发,这样调用方就可以将操作视为已取消或失败,这就是CancelableOperation等人所做的。
编辑:
根据您更新的问题(现在专门询问延迟的Future),您应该考虑使用可取消的Timer。(但是,与Future不同,调用方不能直接等待Timer。如果这对你很重要,你需要创建一个Completer,让调用者在Completer的Future上等待,让Timer的回调完成它。)
发布于 2021-03-02 06:24:46
使用计时器:
var t = Timer(Duration(seconds: 400), () async {
client.close(force: true);
});
...
t.cancel();发布于 2021-02-26 06:29:35
即使取消,使用CancalableOperation也不会阻止print('hello');的执行。它所做的是取消(放弃)结果(在您的情况下无效)。我将使用CancalableOperation和CancalableFuture给出两个例子。
CancelableOperation实例
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 completeCancelableFuture实例
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的实现
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;
}
}https://stackoverflow.com/questions/66380613
复制相似问题