Sự khác biệt giữa async và async * trong Dart là gì?


84

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 asyncasync*. Ai có thể cho tôi biết sự khác biệt giữa chúng là gì?

Câu trả lời:


112

Đá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


2
Bạn nên thêm vào nơi bạn lấy ví dụ, rất vui khi đọc Dart Documentationcũng như tham khảo :)
Skizo-ozᴉʞS

3
@ Skizo-ozᴉʞS liên kết đã chết. Tài liệu tốt nhất mà tôi có thể tìm thấy trên đó là: dart.dev/tutorials/language/streams .
wdev

1
Bằng cách đánh dấu một hàm là không đồng bộ *, chúng tôi có thể sử dụng từ khóa lợi nhuận và trả về Luồng dữ liệu.
Yash

71

Câu trả lời ngắn

  • async cung cấp cho bạn một Future
  • async*cung cấp cho bạn một Stream.

không đồng bộ

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
}

không đồng bộ *

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

Đang xảy ra

Xem các video này để tìm hiểu thêm, đặc biệt là video về Máy phát điện:


2
'Xem những video này' - sẽ rất tuyệt nếu bạn cũng có thể cung cấp các tài liệu tham khảo dạng văn bản . Không phải ai cũng thích video ...
Aconcagua
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.