在Dart中,async
和async*
关键字都用于处理异步操作,但它们的使用场景和返回类型有所不同。
async
当你在函数定义中使用async
关键字时,这表明该函数是一个异步函数,会返回一个Future
。在这样的函数中,你可以使用await
关键字来暂停函数执行,直到某个异步操作完成,并获取该操作的结果。
示例:
dartFuture<String> fetchUserOrder() async { var order = await fetchAsyncFromDatabase(); return 'Your order is: $order'; }
在上面的示例中,fetchAsyncFromDatabase()
是一个异步函数,返回一个未来的数据库查询结果。使用await
关键字,我们可以以近乎同步的方式编写代码,等待结果,然后继续执行。
async*
使用async*
关键字定义的函数是生成器函数,它返回一个Stream
。这允许函数体内部使用yield
和yield*
关键字来提供多个值,这些值将随着时间的推移逐一被发送。
示例:
dartStream<int> countStream(int to) async* { for (int i = 1; i <= to; i++) { await Future.delayed(Duration(seconds: 1)); yield i; // 逐个发送数字 } }
在这个例子中,countStream
函数每隔一秒生成一个数字,直到达到指定的上限。每个yield
操作实际上都是在等待一个Future.delayed
的完成,这模拟了一个耗时操作的情况。
总结
- 使用
async
关键字定义的函数返回一个Future
,适用于单个异步结果。 - 使用
async*
关键字定义的函数返回一个Stream
,适用于生成多个异步事件的情景。
在实际应用中,选择async
还是async*
取决于你需要从函数中获取一个还是多个异步结果。
2024年8月8日 00:50 回复