diff --git a/example/queue_example.dart b/example/queue_example.dart index e9df118..f945c9b 100644 --- a/example/queue_example.dart +++ b/example/queue_example.dart @@ -7,27 +7,36 @@ Future main() async { print(message); } - unawaited(queue.add(() async { - await asyncMessage("Message 1"); - }).then((result) => print("Message 1 complete"))); + unawaited(queue + .add(() async { + await asyncMessage("Message 1"); + }) + .then((result) => print("Message 1 complete")) + .catchError((e) => print("Message 1 error: $e"))); - await queue.add(() async { + unawaited(queue.add(() async { await asyncMessage("Message 2"); - }); + }).catchError((e) => print("Message 2 error: $e"))); - await Future.delayed(const Duration(milliseconds: 500)); + // await Future.delayed(const Duration(milliseconds: 500)); - print('Message 2 complete'); + // print('Message 2 complete'); - unawaited(queue.add(() async { - await asyncMessage("Message 3"); - print("awaited message"); - throw Exception("Error"); - }).then((result) => print("Message 3 complete"))); + queue.cancel(); + + unawaited(queue + .add(() async { + await asyncMessage("Message 3"); + print("awaited message"); + // throw Exception("Error"); + }) + .then((result) => print("Message 3 complete")) + .catchError((e) => print("Message 3 error: $e"))); unawaited(queue .add(() async => asyncMessage("Message 4")) - .then((result) => print("Message 4 complete"))); + .then((result) => print("Message 4 complete")) + .catchError((e) => print("Message 3 error: $e"))); } void unawaited(Future future) {} diff --git a/lib/src/dart_queue_base.dart b/lib/src/dart_queue_base.dart index d2da2ff..a31f8c3 100644 --- a/lib/src/dart_queue_base.dart +++ b/lib/src/dart_queue_base.dart @@ -57,9 +57,7 @@ class Queue { /// Can be edited mid processing int parallel; int _lastProcessId = 0; - bool _isCancelled = false; - bool get isCancelled => _isCancelled; StreamController? _remainingItemsController; Stream get remainingItems { @@ -93,7 +91,6 @@ class Queue { item.completer.completeError(QueueCancelledException()); } _nextCycle.removeWhere((item) => item.completer.isCompleted); - _isCancelled = true; } /// Dispose of the queue @@ -115,7 +112,6 @@ class Queue { /// /// Will throw an exception if the queue has been cancelled. Future add(Future Function() closure) { - if (isCancelled) throw QueueCancelledException(); final completer = Completer(); _nextCycle.add(_QueuedFuture(closure, completer, timeout)); _updateRemainingItems(); @@ -145,9 +141,7 @@ class Queue { } void _queueUpNext() { - if (_nextCycle.isNotEmpty && - !isCancelled && - activeItems.length <= parallel) { + if (_nextCycle.isNotEmpty && activeItems.length <= parallel) { final processId = _lastProcessId; activeItems.add(processId); final item = _nextCycle.first; diff --git a/test/queue_test.dart b/test/queue_test.dart index c274dfd..9ec5d01 100644 --- a/test/queue_test.dart +++ b/test/queue_test.dart @@ -255,4 +255,51 @@ void main() { final result = await queue.add(() async => null); expect(result, null); }); + + test("cancel result 2 and continue next result3", () async { + final queue = Queue(delay: const Duration(milliseconds: 100)); + final results = []; + final errors = []; + final errorResults = []; + + unawaited(queue + .add(() async { + await Future.delayed(const Duration(milliseconds: 10)); + return "result 1"; + }) + .then((result) => results.add(result)) + .catchError((err) { + errors.add(err); + errorResults.add('error 1'); + })); + + unawaited(queue + .add(() async { + await Future.delayed(const Duration(milliseconds: 10)); + return "result 2"; + }) + .then((result) => results.add(result)) + .catchError((err) { + errors.add(err); + errorResults.add('error 2'); + })); + + queue.cancel(); + + await queue + .add(() async { + await Future.delayed(const Duration(milliseconds: 10)); + return "result 3"; + }) + .then((result) => results.add(result)) + .catchError((err) { + errors.add(err); + errorResults.add('error 3'); + }); + + expect(results.length, 2); + expect(errors.length, 1); + expect(errorResults.length, 1); + expect(errorResults.first, 'error 2'); + }); }