对此我感到非常困惑。我要求您澄清一下这个概念。
请考虑以下情形:
案例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
之前,number1
,number2
,number3
仍将具有值。
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
的旧值分别用作number2
和parameter
中的getNumber2()
,那么我会注定的。
答案 0 :(得分:1)
async
/ await
只是底层Future
框架的语法糖。 95%的时间就足够了,并且被样式指南所推荐。
一个例外是,您可能要等待多个期货,直到全部并行完成。在这种情况下,您将需要使用Future.wait([future1, future2, future3])
,而无法使用await
来表示。
答案 1 :(得分:1)
Dart是逐行执行的。因此,当调用该函数时,将首先完成计算,然后将其打印出来。这样您将始终获得2张印刷品
答案 2 :(得分:1)
您可以看到它就像一个主线程,即UI线程。您在该线程中编写的所有操作都将逐行执行,并且在完全执行一行之后将移至下一行。
现在假设您知道一些东西,需要花费一些时间来计算或完全执行,无论结果还是错误。如果将其写在主UI线程(同步线程)中,则意味着您正在停止应用程序的UI,这反过来会使应用程序崩溃(应用程序无响应错误),因为操作系统认为应用程序已冻结但是正如您所知,由于计算的缘故,您正在UI线程中运行,这很花时间,而UI正在等待其完全执行。
因此,为了克服这个问题,我们使用异步方法来计算时间,例如从数据库中获取一些数据,这些数据将返回“未来”的值或错误。主UI线程不等待异步线程。如果在异步任务完成之前没有任何显示给用户,则可以暂时放置加载指示器。
希望这会有所帮助!