Dart Stream's listen () не вызывает onDone
У меня есть поток с трансформатором, который соединяет UTF8.decoder
с LineSplitter
. Он отлично работает, но никогда не вызывает функцию, указанную в параметре onDone
.
import 'dart:async';
import 'dart:io';
import 'dart:convert';
void main(List<String> arguments) {
Stream<List<int>> stream = new File("input.txt").openRead();
stream.transform(UTF8.decoder.fuse(const LineSplitter()))
.listen((line) {
stdout.writeln(line);
}, onDone: () {
stdout.write("done");
}).asFuture().catchError((_) => print(_));
}
Есть идеи, почему его никогда не вызывают?
1 ответ:
import 'dart:async'; import 'dart:io'; import 'dart:convert'; void main(List<String> arguments) { Stream<List<int>> stream = new File("input.txt").openRead(); stream.transform(UTF8.decoder.fuse(const LineSplitter())) .listen((line) { stdout.writeln(line); }, onDone: () { stdout.write("done"); }); //.asFuture().catchError((_) => print(_)); }
/** * Returns a future that handles the [onDone] and [onError] callbacks. * * This method *overwrites* the existing [onDone] and [onError] callbacks * with new ones that complete the returned future. * * In case of an error the subscription will automatically cancel (even * when it was listening with `cancelOnError` set to `false`). * * In case of a `done` event the future completes with the given * [futureValue]. */ Future asFuture([var futureValue]);
Возвращает будущее, которое обрабатывает обратные вызовы [onDone] и [onError].
Этот метод перезаписывает существующие [onDone] и [onError] обратные вызовы новыми, которые завершают возвращенное будущее.
Итак, ответ:
import 'dart:async'; import 'dart:io'; import 'dart:convert'; void main(List<String> arguments) { Stream<List<int>> stream = new File("input.txt").openRead(); stream.transform(UTF8.decoder.fuse(const LineSplitter())) .listen((line) { stdout.writeln(line); }, onDone: () { stdout.write("Not wait me, because 'asFuture' overwrites me"); }).asFuture().catchError((_) => print(_)) .whenComplete(() => stdout.write("done")); }