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 asyncvà 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 asyncvà 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à asynchoặc async*cho phép nó sử dụng async/ awaittừ khóa để sử dụng a Future.
Sự khác biệt giữa cả hai là async*sẽ luôn trả về a Streamvà cung cấp một số đường cú pháp để tạo ra một giá trị thông qua yieldtừ 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 Futureasync*cung cấp cho bạn một Stream.Bạn thêm asynctừ 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 Documentationcũng như tham khảo :)