gpt4 book ai didi

dart - 如果我希望一切都按顺序在函数内执行,是否等待每一行?

转载 作者:行者123 更新时间:2023-12-03 03:10:38 26 4
gpt4 key购买 nike

我肯定知道我的大脑在异步/等待时不是很清楚,所以我需要一些清晰度。我看到了很多示例,其中在某些行上使用了await,而在标记为async的函数中未使用其他代码。例如,我很少见过这样的示例(我将print语句用作简单/基本示例):

myFunction() async {
await functionA();
await print("This really long thing that's going to print out.");
await functionB();
await MyExtraClass.lookupSomethingQuickly();
...
}

因此,我看到的示例通常是这样的:
myFunction() async {
await functionA();
print("This really long thing that's going to print out.");
await functionB();
MyExtraClass.lookupSomethingQuickly();
...
}

因此,我想知道是否只是假设简单的事情会按顺序完成,或者从理论上讲,在绝对需要第1行跟随第2行跟随第3行的情况下,我应该做的是在每一行的前面等待,等等...如果我绝对需要在functionB()关闭之前完成打印该怎么办?

本质上,每次使用async / await编写函数时,我都会发现自己在每行上都进行判断调用,并且我永远不知道我的代码是否由于良好的时机和运气而工作,或者是否曾经有过某些情况会导致执行失败。

最佳答案

async / await是为了使异步代码更易于编写,阅读和推理。同步代码不需要这种支持。
有关Dart中的异步编程,另请参见https://www.dartlang.org/docs/tutorials/futures/

如果您使用此代码示例

import 'dart:async' show Future;
void main() {
doSomethingAsync().then((_) => print('afterwards'));
print('at last');
}

Future doSomethingAsync() {
return new Future.delayed(const Duration(seconds: 1), () {
print('done something');
});
}

DartPad中尝试

哪个打印

at last
done something
afterwards



如果您不熟悉异步执行,这可能会令人惊讶

这是因为传递给 Future.delayed()的代码会延迟1秒执行。执行 Future中的代码后,由 doSomethingAsync()返回的 Future.delayed()实例“完成”。

在这条线
doSomethingAsync().then((_) => print('afterwards'));

我们在 .then(...)返回的 Future上调用 doSomethingAsync(),并将闭包(内联函数)传递给 .then(...)。 ( (_) => print('afterwards'))。
Future的一个功能是它在完成后调用传递给 then(...)的代码(在我们的情况下,是在1秒钟延迟后打印 done something)。

所以执行就像
  • 调用doSomethingAsync(),它调度对print('done something)的调用以供以后执行,并返回一个Future
  • 调用仅打印print('at last');at last
  • 1秒钟延迟 print('done something')后的
  • 被称为
  • Future返回的doSomethingAsync()已完成
  • Future调用`(__ => print('afterwards')
  • main()结束。

  • 当我们使用 async / await时,代码看起来像
    import 'dart:async' show Future;
    Future main() async {
    await doSomethingAsync();
    print('afterwards');
    print('at last');
    }

    Future doSomethingAsync() {
    return new Future.delayed(const Duration(seconds: 1), () {
    print('done something');
    });
    }

    DartPad中尝试

    运行时,输出为

    done something
    afterwards
    at last



    我们也可以在 async中使用 await / doSomethingAsync(),但现在我们只关注 main()
    现在执行看起来像
  • 调用doSomething()并等待返回的Future完成
  • print('done something')已执行,而Future已完成
  • 继续执行
  • 后执行代码
  • await
  • print('afterwards');

  • 这可能是您预期的行为。

    对您的原始问题。仅当调用返回 print('at last');并且您希望仅在 await完成时才执行以下代码时,才需要 Future。如果调用未返回 Future,则没有任何等待。
    Future仍然是有效代码。这是为了支持有时执行一些异步工作并返回 await print('xxx')的函数,但有时又没有异步工作来立即执行代码并随后返回的函数。在这种情况下,无需等待。
    someTimesAsync() {
    if(new DateTime.now().weekday == 1) {
    return new Future.delayed(const Duration(seconds: 1), () {
    print('done something');
    });
    } else {
    print('done something');
    }
    }
    await someTimesAsync();

    在两种情况下均有效。如果不是这样,那就太麻烦了。

    有关 Future / async的更多详细信息,请参见 https://www.dartlang.org/articles/await-async/

    关于dart - 如果我希望一切都按顺序在函数内执行,是否等待每一行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36171385/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com