Dart Lang:避免用异步标记所有函数



Dart新手在这里,我目前正在学习Dart中的异步执行。我对并发在 Dart 中的工作方式有点恼火,从他们的 Codelab 中获取以下场景:

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 的等待/异步机制,每个与异步操作相关的函数都需要具有Future<>返回类型,并且必须使用async标记。

这感觉很笨拙...想象一下,如果我的函数链深处的某个值是异步计算的,我真的需要总是返回一个未来吗?除了等待之外,还有其他构造来同步 Dart 中的代码吗?还是我误解了这个概念?

如果调用方需要能够等待异步操作完成,则异步函数必须返回可以awaited 的Future。 这是传染性的;如果这些调用方的调用方需要能够等待,那么他们也需要有Future等待。

如果调用者不应该等待,那么你可以有一个不需要返回Future的"即发即弃"函数:

Future<void> foo() {
// ...
}
// Does not need to return a Future.  Consequently, callers cannot
// directly determine when `foo` completes.
void bar() {
foo();
}

最新更新