在Dart中使用Futures循环

时间:2014-06-26 18:29:28

标签: dart future

好的,所以我有一个文件列表,我需要在列表的每个成员上运行一个函数。我基本上想做这样的事情:

for(File file in files) {
    functionThatReturnsAFuture(file);
}

但显然这不会起作用,因为返回Future的函数是异步的。这是我唯一的选择吗?

List<File> files = new List<File>();
// Add files somewhere

Future processFile(int i) {
   return new Future.sync(() {
       //Do stuff to the file
       if(files.length>i+1) {
           return processFile(i+1);
       }
   });
}

processFile(0);

编辑: 我想更多的背景是重要的。最终目标是将多个文件合并到一个JSON对象中,以便提交给服务器。 FileReader对象使用事件来执行读取,因此我使用Completer创建了一个提供Future的包装函数。我可以让所有这些都异步运行,然后触发一个事件,当它们全部完成时提交它,但是这相对很多的设置与for-each-loop使它全部工作(如果一个存在,无论如何)。核心问题是需要在文件列表上运行Future-returning函数,然后执行完全取决于它们的操作。

3 个答案:

答案 0 :(得分:17)

当您需要等待多个期货完成并且您不关心订单时,您可以使用Future.wait()

Future.wait(files.map(functionThatReturnsAFuture))
  .then((List response) => print('All files processed'));

如果订单很重要,您可以使用Future.forEach()代替等待每个Future完成,然后再转到下一个元素:

Future.forEach(files, functionThatReturnsAFuture)
  .then((response) => print('All files processed'));

答案 1 :(得分:4)

Dart支持async / await因为相当长的一段时间允许它写为

someFunc() async {
  for(File file in files) {
    await functionThatReturnsAFuture(file);
  }
}

答案 2 :(得分:0)

该库可以帮助https://pub.dartlang.org/packages/heavylist

HeavyList<File> abc = new HeavyList<File>([new File(), new File(), ]);
abc.loop(new Duration(seconds: 1), (List<File> origin) {
print(origin);
}, (File item, Function resume) {
  //simulating an asynchronous call
  print(item);
  //move to next item
  resume();
});