Sobes.tech
Junior — Middle

Je možné prerušiť vykonávanie úlohy vrátenej cez Future a ako to urobiť?

sobes.tech AI

Odpoveď od AI

V Dart-e (a, v súlade s tým, v Flutter-e) nie je možné priamo prerušiť úlohu, ktorá je vrátená cez Future, pretože Future nepodporuje zrušenie. Avšak, je možné implementovať nepriamu zrušiteľnosť pomocou vlajok alebo kontrolérov, ktoré sa kontrolujú vo vnútri asynchrónnej operácie.

Napríklad, môžete použiť Completer a kontrolovať stav zrušenia:

class CancellableOperation {
  bool _isCancelled = false;

  Future<String> run() async {
    for (int i = 0; i < 10; i++) {
      if (_isCancelled) {
        throw Exception('Operácia zrušená');
      }
      await Future.delayed(Duration(seconds: 1));
    }
    return 'Hotovo';
  }

  void cancel() {
    _isCancelled = true;
  }
}

void main() async {
  final operation = CancellableOperation();
  final future = operation.run();

  // Po 3 sekundách zrušíme
  Future.delayed(Duration(seconds: 3), () {
    operation.cancel();
  });

  try {
    final result = await future;
    print(result);
  } catch (e) {
    print(e); // Operácia zrušená
  }
}

Pre zložitejšie prípady môžete použiť balíčky ako async s CancelableOperation.

Takže, priama zrušiteľnosť Future nie je možná, ale logiku zrušenia je možné implementovať vo vnútri samotnej úlohy.