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

问题描述 投票:0回答:1

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

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

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

我希望以至少5秒的间隔或总的函数执行时间+ 5秒(如果函数本身需要很长的执行时间)被调用_fetchMarkersFromDb()。我不希望它像现在这样并行运行。我听说可以使用Streams,但是对于在间隔内重复调用该函数时如何使用它们感到困惑。

可以找到完整的源代码here,而我要解决的问题是here。预先感谢。

我正在制作Flutter应用,我需要每5秒定期调用一个功能。这是我当前的实现:Timer.periodic(markerRefreshInterval,(Timer t){print('$ ...

asynchronous flutter dart stream future
1个回答
0
投票

我不知道数据库调用到底有什么返回类型(如果有的话,我在这里假设List<int>,但是对于5秒或(执行时间+ 5秒),您可以使用类似下面的模拟方法:] >

import 'dart:math';

// simulating network call
Future<List<int>> _fetchMarkersFromDb() async {
 await Future.delayed(Duration(seconds: Random().nextInt(7)));
 return [Random().nextInt(993) + 27, Random().nextInt(28) + 4];
}

Stream<List<int>> _timer() async* {
  while (true) {
    yield await _fetchMarkersFromDb();
    await Future.delayed(Duration(seconds: 5));
  }
}

void main() {
  _timer().listen(print);
}
© www.soinside.com 2019 - 2024. All rights reserved.