到底什么时候使用async-await然后呢?

时间:2019-06-22 12:06:16

标签: flutter dart

对此我感到非常困惑。我要求您澄清一下这个概念。

请考虑以下情形:

案例1:

seq ${2:-3} |
  parallel --tty -j0 eval sidplayfp -wch{}.wav '{=$_=join" ",map{"-u".$_}grep!/@{[seq()]}/,(1..total_jobs())=}' ${@:3} -q $1 '2>/dev/null'

我知道这很好用。终端上将显示“ 2”。

但是我为什么不应该在这里使用int number = 0; void calculate() { number = number + 2; print(number); } -async

await

在我看来这是合乎逻辑的,因为 int number = 0; void calculate() async { void addition() async { number = number + 2; } await addition(); print(number); } 应该等待print(number)完成。为什么这不是必需的? dart如何知道要先执行哪个操作?

如何确保在number = number + 2上没有执行print(number)并且在终端上打印“ 0”之前?

number = number + 2

案例2: 考虑一下我正在与Does the sequence in which we write these operations in the function matter? 数据库进行交互并且获取的值相互依赖的情况。

注意:在调用以下SQFLite之前,number1number2number3仍将具有值。

function

我的应用程序中有很多这类功能,我到处都在做。

我有点偏执,我想如果将void getValues() async { void calculate1() { number1 = await db.getNumber1(10); } void calculate2() { number2 = await db.getNumber2(number1); } await calculate1().then((_) async { await calculate2().then((_) async { number3 = await db.getNumber3(number2); }); }); } number1的旧值分别用作number2parameter中的getNumber2(),那么我会注定的。

3 个答案:

答案 0 :(得分:1)

async / await只是底层Future框架的语法糖。 95%的时间就足够了,并且被样式指南所推荐。

一个例外是,您可能要等待多个期货,直到全部并行完成。在这种情况下,您将需要使用Future.wait([future1, future2, future3]),而无法使用await来表示。

答案 1 :(得分:1)

Dart是逐行执行的。因此,当调用该函数时,将首先完成计算,然后将其打印出来。这样您将始终获得2张印刷品

答案 2 :(得分:1)

您可以看到它就像一个主线程,即UI线程。您在该线程中编写的所有操作都将逐行执行,并且在完全执行一行之后将移至下一行。

现在假设您知道一些东西,需要花费一些时间来计算或完全执行,无论结果还是错误。如果将其写在主UI线程(同步线程)中,则意味着您正在停止应用程序的UI,这反过来会使应用程序崩溃(应用程序无响应错误),因为操作系统认为应用程序已冻结但是正如您所知,由于计算的缘故,您正在UI线程中运行,这很花时间,而UI正在等待其完全执行。

因此,为了克服这个问题,我们使用异步方法来计算时间,例如从数据库中获取一些数据,这些数据将返回“未来”的值或错误。主UI线程不等待异步线程。如果在异步任务完成之前没有任何显示给用户,则可以暂时放置加载指示器。

希望这会有所帮助!