Difference between await for and listen in Dart

时光怂恿深爱的人放手 提交于 2019-12-30 06:21:08

问题


I am trying to create a web server stream. Here is the code:

import 'dart:io';

main() async {
  HttpServer requestServer = await HttpServer.bind(InternetAddress.LOOPBACK_IP_V4, 8000);

requestServer.listen((request) {   //comment out this or the await for to work
  request.response
    ..write("This is a listen stream")
    ..close();
});

  await for (HttpRequest request in requestServer) {
  request.response
    ..write("This is an await for stream")
    ..close();
  }
}

What is the difference between listen and await for? They both do not work at the same time. You need to comment out one or the other to work, but there doesn't seem to be a difference in function here. Are there circumstances where there is a difference, and when should you use one over the other?


回答1:


Given:

Stream<String> stream = new Stream<String>.fromIterable(['mene', 'mene', 'tekel', 'parsin']);

then:

print('BEFORE');
stream.listen((s) { print(s); });
print('AFTER');

yields:

BEFORE
AFTER
mene
mene
tekel
parsin

whereas:

print('BEFORE');
await for(String s in stream) { print(s); }
print('AFTER');

yields:

BEFORE
mene
mene
tekel
parsin
AFTER

stream.listen() sets up code that will be put on the event queue when an event arrives, then following code is executed.

await for suspends between events and keeps doing so until the stream is done, so code following it will not be executed until that happens.

I use `await for when I have a stream that I know will have finite events, and I need to process them before doing anything else (essentially as if I'm dealing with a list of futures).

Check https://www.dartlang.org/articles/language/beyond-async for a description of await for.




回答2:


The main difference is when there's code afterwards. listen only register the handler and the execution continue. await for will retain execution until the stream is closed.

Thus if you add a print('hello'); at the end of your main you shouldn't see hello in the output with await for (because the request stream is never closed). Try the following code on dartpad to see the differences :

import 'dart:async';
main() async {
  tenInts.listen((i) => print('int $i'));
  //await for (final i in tenInts) {
  //  print('int $i');
  //}
  print('hello');
}
Stream<int> get tenInts async* {
  for (int i = 1; i <= 10; i++) yield i;
}


来源:https://stackoverflow.com/questions/42611880/difference-between-await-for-and-listen-in-dart

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!