2017-03-05 45 views
5

Próbuję utworzyć strumień serwera WWW. Oto kod:Różnica między oczekiwaniem i słuchaniem w Dart

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(); 
    } 
} 

Na czym polega różnica między oczekiwaniem a odsłuchaniem? Oboje nie działają w tym samym czasie. Musisz komentować jeden lub drugi, aby działał, ale tutaj nie ma różnicy w funkcjonowaniu. Czy istnieją okoliczności, w których występuje różnica i kiedy należy korzystać z jednej nad drugą?

Odpowiedz

8

Dane:

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

wówczas:

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

Wynik:

BEFORE 
AFTER 
mene 
mene 
tekel 
parsin 

czym:

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

plony:

BEFORE 
mene 
mene 
tekel 
parsin 
AFTER 

stream.listen() ustawia się kod, który zostanie oddany w kolejce zdarzeń, gdy zdarzenie przybywa, a następnie kod jest wykonywany następujący.

await for zawiesza między zdarzeniami i robi tak aż do zakończenia strumienia, więc kod następujący po nim nie zostanie wykonany, dopóki tak się nie stanie.

Używam `czekam na kiedy mam strumień, który wiem, że będzie miał skończone zdarzenia i muszę je przetworzyć przed zrobieniem czegokolwiek innego (zasadniczo tak, jakbym miał do czynienia z listą kontraktów terminowych).

Aby uzyskać opis await for, sprawdź: https://www.dartlang.org/articles/language/beyond-async.

+0

Opcja 'czekają for (var x w strumieniu) ...' składnia jest bliżej równoznaczne z 'czekają stream.forEach ((x) {...}) niż' 'listen', podobnie jak' for (var x in iterable) ... 'jest podobne do' iterable.forEach ((x) {...}) '. Różnice wynikają z pętli 'for', które umożliwiają sterowanie przepływem, którego' forEach' nie ma. – lrn

5

Główna różnica polega na tym, że później jest kod. listen tylko zarejestrować program obsługi, a wykonanie kontynuować. await for zachowa wykonanie, dopóki strumień nie zostanie zamknięty.

Zatem jeśli dodać print('hello'); na końcu main nie powinien zobaczyć powitania w wyjściu z await for (ponieważ strumień żądanie nigdy nie jest zamknięta). Try the following code on dartpad aby zobaczyć różnice:

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; 
}