gpt4 book ai didi

asynchronous - 如何仅在 Dart 中完成上一次执行后才定期调用函数?

转载 作者:行者123 更新时间:2023-12-03 02:44:37 28 4
gpt4 key购买 nike

我正在制作一个 Flutter 应用程序,我需要每 5 秒定期调用一个函数。这是我当前的实现:

Timer.periodic(markerRefreshInterval, (Timer t) {
print('$markerRefreshInterval seconds over, refreshing...');
_fetchMarkersFromDb(); // updates markers every 5 seconds
});

但是,有时(由于网络问题等)_fetchMarkersFromDb() 函数的执行时间超过 5 秒。在这种情况下,我发现(借助控制台中的调试打印)有多个实例(线程?)并行执行同一函数。这弄乱了我试图在每个函数调用中递增的变量。

我希望 _fetchMarkersFromDb() 以至少 5 秒的间隔或总函数执行时间 + 5 秒(如果函数本身执行时间长)被调用。我不希望它像现在这样并行运行。听说可以用Streams,但是在一个区间内反复调用函数,不知道怎么用。

可以找到完整的源代码here ,我要解决的问题是 here .提前致谢。

最佳答案

您可以使用包 https://pub.dev/packages/neat_periodic_task
它具有以下特点

  • 循环运行周期性任务。
  • 限制最大运行时间以防止挂起循环。
  • 在超时后重试失败的任务执行。
  • 捕获并记录任务中的所有异常/错误。
  • (可选)阻止并发任务使用支持乐观并发的存储服务(例如 Cloud Datastore、Google Cloud Storage)中的状态。
  • 打印周期性任务的活跃度监控日志消息。

示例代码片段

import 'dart:io';
import 'package:neat_periodic_task/neat_periodic_task.dart';

void main() async {

final scheduler = NeatPeriodicTaskScheduler(
interval: Duration(seconds: 5),
name: 'hello-world',
timeout: Duration(seconds: 5),
task: () async => print('Hello World'),
minCycle: Duration(seconds: 5),
);

scheduler.start();
await ProcessSignal.sigterm.watch().first;
await scheduler.stop();
}

关于asynchronous - 如何仅在 Dart 中完成上一次执行后才定期调用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59251850/

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