2017-03-05 30 views
5

Tôi đang cố gắng tạo luồng máy chủ web. Đây là mã:Sự khác biệt giữa chờ đợi và nghe trong 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(); 
    } 
} 

Sự khác biệt giữa nghe và chờ đợi là gì? Cả hai đều không hoạt động cùng một lúc. Bạn cần phải bình luận ra một hoặc khác để làm việc, nhưng có vẻ không phải là một sự khác biệt trong chức năng ở đây. Có những hoàn cảnh nào có sự khác biệt hay không và khi nào bạn nên sử dụng cái khác?

Trả lời

8

Given:

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

thì:

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

sản lượng:

BEFORE 
AFTER 
mene 
mene 
tekel 
parsin 

khi:

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

sản lượng:

BEFORE 
mene 
mene 
tekel 
parsin 
AFTER 

stream.listen() thiết lập mã mà sẽ được đưa vào hàng đợi sự kiện khi một sự kiện đến, sau đó sau mã được thực thi.

await for tạm dừng giữa các sự kiện và tiếp tục làm như vậy cho đến khi luồng được thực hiện, do đó, mã theo dõi sẽ không được thực hiện cho đến khi điều đó xảy ra.

Tôi sử dụng 'đang chờ đợi khi có một luồng mà tôi biết sẽ có các sự kiện hữu hạn và tôi cần xử lý chúng trước khi thực hiện bất kỳ điều gì khác (về cơ bản là nếu tôi đang xử lý danh sách tương lai).

Kiểm tra https://www.dartlang.org/articles/language/beyond-async để biết mô tả của await for.

+0

Lệnh 'chờ đợi for (var x trong dòng) ...' cú pháp là một gần tương đương với 'chờ stream.forEach ((x) {...})' hơn 'listen', giống như' for (var x in iterable) ... 'tương tự như' iterable.forEach ((x) {...}) '. Sự khác biệt xuất phát từ các vòng lặp 'for' cho phép luồng điều khiển mà' forEach' không có. – lrn

5

Sự khác biệt chính là khi có mã sau đó. listen chỉ đăng ký trình xử lý và thực hiện tiếp tục. await for sẽ tiếp tục thực hiện cho đến khi luồng được đóng.

Vì vậy, nếu bạn thêm một print('hello'); ở phần cuối của bạn main bạn không nên thấy chào trong đầu ra với await for (vì dòng yêu cầu là không bao giờ khép kín). Try the following code on dartpad để thấy sự khác biệt:

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; 
} 
Các vấn đề liên quan