Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asynchronous 如何仅在函数在Dart中完成上一次执行时定期调用函数?_Asynchronous_Flutter_Dart_Stream_Future - Fatal编程技术网

Asynchronous 如何仅在函数在Dart中完成上一次执行时定期调用函数?

Asynchronous 如何仅在函数在Dart中完成上一次执行时定期调用函数?,asynchronous,flutter,dart,stream,future,Asynchronous,Flutter,Dart,Stream,Future,我正在制作一个颤振应用程序,我需要每隔5秒定期调用一个函数。以下是我当前的实现: Timer.periodic(markerRefreshInterval, (Timer t) { print('$markerRefreshInterval seconds over, refreshing...'); _fetchMarkersFromDb(); // updates markers every 5 seconds }); 但是,有时(由于网络问题等原因),\u fetchMa

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

Timer.periodic(markerRefreshInterval, (Timer t) {
    print('$markerRefreshInterval seconds over, refreshing...');
    _fetchMarkersFromDb(); // updates markers every 5 seconds
});
但是,有时(由于网络问题等原因),
\u fetchMarkersFromDb()
函数的执行时间超过5秒。在这种情况下,我发现(借助控制台中的调试打印),同一个函数有多个实例(线程?)并行执行。这会弄乱我试图在每个函数调用中增加的变量

我希望以5秒的最小间隔调用
\u fetchMarkersFromDb()
,或者函数的总执行时间+5秒(如果函数本身执行时间较长)。我不希望它像现在一样并行运行。我听说可以使用流,但我不知道如何在间隔内重复调用函数时使用流


可以找到完整的源代码,我试图解决的问题是。提前感谢。

我不知道DB调用的确切返回类型(如果有,我假设这里是
列表),但在5秒或(执行时间+5秒)内,您可以使用类似以下模拟的内容:

import'dart:math';
//模拟网络呼叫
Future _fetchMarkersFromDb()异步{
等待未来。延迟(持续时间(秒:Random().nextInt(7));
返回[Random().nextInt(993)+27,Random().nextInt(28)+4];
}
流_timer()异步*{
while(true){
yield wait_fetchMarkersFromDb();
等待未来。延迟(持续时间(秒:5));
}
}
void main(){
_计时器()。侦听(打印);
}
您还可以添加油门/从

您可以使用软件包
它具有以下功能

  • 在循环上运行定期任务
  • 限制最大运行时间以防止挂起循环
  • 超时后重试失败的任务执行
  • 捕获并记录任务中的所有异常/错误
  • (可选)在支持乐观并发的存储服务(例如,云数据存储、Google云存储)中使用状态防止并发任务
  • 打印日志消息定期任务的活动性监视
示例代码段

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();
}

此代码应能正常工作:

import 'dart:async';
import 'dart:math';

Future<void> main() async {
  Timer(Duration(seconds: 0), _callback);
}

Future<void> _callback() async {
  print('started: ${DateTime.now()}');
  try {
    final ms = Random().nextInt(5000);
    await Future.delayed(Duration(milliseconds: ms));
  } finally {
    print('finished: ${DateTime.now()}');
    Timer(Duration(seconds: 5), _callback);
  }
}
导入'dart:async';
导入“dart:math”;
Future main()异步{
计时器(持续时间(秒数:0),_回调);
}
Future\u callback()异步{
打印('started:${DateTime.now()}');
试一试{
最终ms=Random().nextInt(5000);
等待未来。延迟(持续时间(毫秒:毫秒));
}最后{
打印('finished:${DateTime.now()}');
计时器(持续时间(秒数:5),_回调);
}
}
结果:

started: 2020-01-04 17:51:29.401246 finished: 2020-01-04 17:51:32.972114 started: 2020-01-04 17:51:37.973218 finished: 2020-01-04 17:51:38.551234 started: 2020-01-04 17:51:43.552218 finished: 2020-01-04 17:51:47.579374 started: 2020-01-04 17:51:52.580253 finished: 2020-01-04 17:51:55.547275 started: 2020-01-04 17:52:00.548258 finished: 2020-01-04 17:52:01.156281 开始时间:2020-01-04 17:51:29.401246 完成时间:2020-01-0417:51:32.972114 开始时间:2020-01-04 17:51:37.973218 完成时间:2020-01-04 17:51:38.551234 开始时间:2020-01-04 17:51:43.552218 完成时间:2020-01-04 17:51:47.579374 开始时间:2020-01-04 17:51:52.580253 完成时间:2020-01-04 17:51:55.547275 开始时间:2020-01-04 17:52:00.548258 完成时间:2020-01-0417:52:01.156281