【问题标题】:Dart Lang: Avoid marking all functions with asyncDart Lang:避免使用异步标记所有函数
【发布时间】:2020-04-20 05:36:58
【问题描述】:

这里是 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 的 await / async 机制,每个与异步操作相关的函数都需要有一个Future&lt;&gt; 返回类型,并且必须用async 标记。

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

【问题讨论】:

  • 任何调用异步函数的东西本质上都是异步的。这就是它在 Dart、Javascript (ES6)、Typescript 和 Python 3.5+ 中的工作方式。 (如果函数不使用相应的await 语法糖,则不必声明 async

标签: asynchronous dart dart-async


【解决方案1】:

如果调用者需要能够等待您的异步操作完成,那么您的异步函数必须返回一个Future,它可以是awaited。这是具有传染性的;如果这些呼叫者的呼叫者需要能够等待,那么他们也需要有Futures 等待。

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

Future<void> foo() {
  // ...
}

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

【讨论】:

  • 我不明白为什么调用函数也必须是异步的?为什么不在等待时阻塞主线程?
  • 当我执行 aysnc 函数时实际发生了什么?它会产生一个新线程吗?
  • @Wecherowski Dart 是单线程的(但允许通过 isolate 并行执行,这更类似于单独的进程)。异步函数的重点是避免阻塞。异步函数将执行推迟到 Dart 事件循环。另请阅读medium.com/dartlang/…
  • 好的,知道了。对 await 的实际目的(来自 Java 世界)有点困惑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-18
  • 1970-01-01
  • 2021-04-28
  • 2017-04-28
  • 1970-01-01
  • 2020-04-12
相关资源
最近更新 更多