gpt4 book ai didi

dart - Dart 在结束后重复一个功能

转载 作者:行者123 更新时间:2023-12-03 03:18:21 25 4
gpt4 key购买 nike

我有一个长期运行的功能,可以进行一些后台处理。

函数完成后,我想在短暂的延迟后重复。

做这个的最好方式是什么?

我最终得到了这个凌乱的代码

  bool busy = false;
new Timer.periodic(const Duration(minutes:1) , (_)async {

if( !busy){
busy = true;
await downloader.download();
busy = false;
}
});

最佳答案

要在完成一小段延迟后重复执行某个功能,请执行以下操作:

  • 需要知道何时完成,
  • 需要知道何时经过了短暂的延迟
  • ,需要再次调用该函数。

  • 我将创建一个单独的函数来进行调用和重新调用,因为它可以更好地分离关注点。
    首先,我假设函数完成后会返回Future。然后有很多不同的方式等待一小段延迟,我将只使用最基本的方法 new Timer,然后通过再次调用该函数来重复该过程。

    Future myFunction() {
    // do long operation in background, complete returned future when done.
    }

    void repeatMyFunction() {
    myFunction().then((_) {
    // using .then instead of .whenComplete, so we stop in
    // case of an error.
    new Timer(const Duration(millseconds: shortDelay), repeatMyFunction);
    });
    }

    如果想找回错误,可以创建一个新的 future :

    Future repeatMyFunction() {
    Completer completer = new Completer();
    void loop() {
    myFunction().then((_) {
    // using .then instead of .whenComplete, so we stop in
    // case of an error.
    new Timer(const Duration(millseconds: shortDelay), loop);
    }, onError: completer.completeError);
    }
    loop();
    return completer.future;
    }

    如果您允许多个错误,并且不想停下来,则可以将错误作为流返回,并且可以添加函数结果作为值,以达到很好的效果:

    Stream repeatMyFunction() {
    StreamController controller = new StreamController();
    void loop() {
    myFunction().then(controller.add, onError: controller.addError)
    .whenComplete(() {
    new Timer(const Duration(millseconds: shortDelay), loop);
    }
    loop();
    return controller.stream;
    }

    这些重复方式都无法阻止它。为此,我会将额外的将来传递给重复功能,并在该将来完成时停止。

    void repeatMyFunction(Future stop) {
    bool stopFlag = false;
    stop.whenComplete(() { stopFlag = true; });
    void loop() {
    myFunction().then((_) {
    if (!stopFlag) {
    new Timer(const Duration(millseconds: shortDelay), loop);
    }
    });
    }
    loop();
    }

    其他变体也可以停止使用,并在停止使用完成时完成将来/关闭流。

    Günter的建议也很好,也更简单(但我希望控制的细粒度少一些)。您可以使用以下方法将其代码转换为流:

    Stream repeatMyFunction() async* {
    while (true) { // Stops if something throws.
    yield await myFunction();
    await new Future.delayed(const Duration(milliseconds: shortDelay));
    }
    }

    关于dart - Dart 在结束后重复一个功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30435093/

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