【问题标题】:Async-await in dart runs synchronously?飞镖中的异步等待同步运行?
【发布时间】:2021-09-05 22:08:41
【问题描述】:

我正在尝试使用 async await 进行异步编程的 Future。 我测试的代码是一个简单的 Future。

//order a new coffee perhaps!
Future<String> order(String newOrder){
  final String Function() func = ()=> "${newOrder} is requested!";

  final _order = Future.delayed(Duration(seconds: 5),func);

  return _order;
}

当我像承诺一样运行这段代码时。

  order("promised order")
  .then((result) => print(result))
  .catchError((err){
    print(err.error);
  });

这表现得像一个异步非阻塞代码

但是,当我使用 async/await 运行相同的代码时,它的行为类似于同步代码并阻塞所有其他代码,它会等待 5 秒才能运行下一行。

void main(List<String> arguments) async {
  final _myOrder  = await order('Lattee mocha');
  print(_myOrder);
 //...all the other code waits for
} 

所以我认为 async/await 与未阻塞的期货相同。 怎么会阻塞其他代码执行?

【问题讨论】:

  • await 没有阻塞。什么代码在等待 5 秒才能执行?在 Promise 示例中,print(result) 何时运行?在await 示例中,await 之后的所有内容都是延续的一部分,并将在 await 完成后运行

标签: dart async-await


【解决方案1】:

async/await 模式的全部意义等待(因此 await)直到 Future 完成,然后才继续使用此代码执行。

将其视为一种避免无穷无尽的.then() 链并大大简化错误处理的方法。

如果您想等待,那么您只需省略 await 关键字。显然,如果你不(a)等待,你就不会得到结果。

当经典的.then() 链更适合您的程序时,您仍然可以使用它。

人们所说的“非阻塞”是指当编译器看到 await 关键字时,它知道要保持程序的其余部分、事件循环、动画等运行而不是阻塞 完整的程序

【讨论】:

  • 确实如此。我明白你的意思,也便于阅读。
  • 但是在 .then() 中它的行为不同,因为在网络上它声明它与 promises 是一样的。 Future 行为异步非阻塞
  • 假设您的意思是 Javascript 承诺,Dart Futures 的行为完全相同。如果您使用 async/await 为 Javascript Promises 编写代码,您将获得相同的输出。
  • 我明白你的意思了。
  • 我感到困惑的原因是,当我运行代码时,带有承诺的代码允许执行并且所有代码都运行并且承诺的结果在最后:但是在异步代码中暂停并等待它完成,然后允许执行,因此阻塞代码
猜你喜欢
  • 2019-05-07
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多