Tôi đang tạo một ứng dụng sử dụng khung làm việc. Trong thời gian này, tôi đã xem qua các từ khóa trong Dart async
và async*
. Ai có thể cho tôi biết sự khác biệt giữa chúng là gì?
Tôi đang tạo một ứng dụng sử dụng khung làm việc. Trong thời gian này, tôi đã xem qua các từ khóa trong Dart async
và async*
. Ai có thể cho tôi biết sự khác biệt giữa chúng là gì?
Câu trả lời:
Đánh dấu một hàm là async
hoặc async*
cho phép nó sử dụng async
/ await
từ khóa để sử dụng a Future
.
Sự khác biệt giữa cả hai là async*
sẽ luôn trả về a Stream
và cung cấp một số đường cú pháp để tạo ra một giá trị thông qua yield
từ khóa.
Do đó, chúng tôi có thể làm như sau:
Stream<int> foo() async* {
for (int i = 0; i < 42; i++) {
await Future.delayed(const Duration(seconds: 1));
yield i;
}
}
Hàm này phát ra một giá trị mỗi giây, giá trị đó tăng lên mỗi lần
async
cung cấp cho bạn một Future
async*
cung cấp cho bạn một Stream
.Bạn thêm async
từ khóa vào một hàm thực hiện một số công việc có thể mất nhiều thời gian. Nó trả về kết quả được bao bọc trong a Future
.
Future<int> doSomeLongTask() async {
await Future.delayed(const Duration(seconds: 1));
return 42;
}
Bạn có thể nhận được kết quả đó bằng cách chờ đợi Tương lai:
main() async {
int result = await doSomeLongTask();
print(result); // prints '42' after waiting 1 second
}
Bạn thêm async*
từ khóa để tạo một hàm trả về một loạt các giá trị trong tương lai cùng một lúc. Các kết quả được bao bọc trong một Luồng.
Stream<int> countForOneMinute() async* {
for (int i = 1; i <= 60; i++) {
await Future.delayed(const Duration(seconds: 1));
yield i;
}
}
Thuật ngữ kỹ thuật cho điều này là chức năng máy phát điện không đồng bộ . Bạn sử dụng yield
để trả về một giá trị thay vìreturn
vì vì bạn không rời khỏi hàm.
Bạn có thể sử dụng await for
để đợi từng giá trị do Luồng phát ra.
main() async {
await for (int i in countForOneMinute()) {
print(i); // prints 1 to 60, one integer per second
}
}
Xem các video này để tìm hiểu thêm, đặc biệt là video về Máy phát điện:
Dart Documentation
cũng như tham khảo :)