Dart Lang:避免使用异步标记所有函数
Dart Lang: Avoid marking all functions with async
这里是 Dart 新手,我目前正在学习 Dart 中的异步执行。我对并发在 Dart 中的工作方式有点恼火,从他们的代码实验室中获取以下场景:
void printOrderMessage () async {
try {
var order = await fetchUserOrder();
print('Awaiting user order...');
print(order);
} catch (err) {
print('Caught error: $err');
}
}
Future<String> fetchUserOrder() {
// Imagine that this function is more complex.
var str = Future.delayed(Duration(seconds: 4), () => throw 'Cannot locate user order');
return str;
}
Future<void> main() async {
await printOrderMessage();
}
在这种情况下,异步操作是从数据库中获取用户订单。现在由于 Dart 的 await / async 机制,每个与异步操作相关的函数都需要有一个 Future<>
return 类型并且必须用 async
标记。
这感觉很笨拙……想象一下,如果我的函数链深处的某些值是异步计算的,我真的需要总是 return 一个未来吗?除了 await 之外,还有其他一些结构可以在 Dart 中同步代码吗?还是我误解了这个概念?
如果调用方需要能够等待您的异步操作完成,那么您的异步函数必须return一个Future
可以await
编辑。这是会传染的;如果这些呼叫者的呼叫者需要等待,那么他们也需要 Future
等待。
如果呼叫者 不 等待,那么您可以拥有一个不需要 return Future
的“即发即弃”功能:
Future<void> foo() {
// ...
}
// Does not need to return a Future. Consequently, callers cannot
// directly determine when `foo` completes.
void bar() {
foo();
}
这里是 Dart 新手,我目前正在学习 Dart 中的异步执行。我对并发在 Dart 中的工作方式有点恼火,从他们的代码实验室中获取以下场景:
void printOrderMessage () async {
try {
var order = await fetchUserOrder();
print('Awaiting user order...');
print(order);
} catch (err) {
print('Caught error: $err');
}
}
Future<String> fetchUserOrder() {
// Imagine that this function is more complex.
var str = Future.delayed(Duration(seconds: 4), () => throw 'Cannot locate user order');
return str;
}
Future<void> main() async {
await printOrderMessage();
}
在这种情况下,异步操作是从数据库中获取用户订单。现在由于 Dart 的 await / async 机制,每个与异步操作相关的函数都需要有一个 Future<>
return 类型并且必须用 async
标记。
这感觉很笨拙……想象一下,如果我的函数链深处的某些值是异步计算的,我真的需要总是 return 一个未来吗?除了 await 之外,还有其他一些结构可以在 Dart 中同步代码吗?还是我误解了这个概念?
如果调用方需要能够等待您的异步操作完成,那么您的异步函数必须return一个Future
可以await
编辑。这是会传染的;如果这些呼叫者的呼叫者需要等待,那么他们也需要 Future
等待。
如果呼叫者 不 等待,那么您可以拥有一个不需要 return Future
的“即发即弃”功能:
Future<void> foo() {
// ...
}
// Does not need to return a Future. Consequently, callers cannot
// directly determine when `foo` completes.
void bar() {
foo();
}