飞镖流,等待

时间:2019-12-31 23:23:46

标签: dart async-await stream

我无法理解以下代码的流程。 该代码应处理MERGE_SIZE行(此运行中为3行),将这些行保存到“阶段”文件中,然后处理接下来的3行,依此类推。

对savePhase的调用正在等待,因此我期望在处理其他行之前完成savePhase。

正如您在输出中看到的,每行下面都是进程,然后savePhase调用完成。

Future _sort() async {
    var completer = Completer<void>();
    var instance = 0;
    var lineCount = MERGE_SIZE;

    var phaseDirectory = Directory.systemTemp.createTempSync();

    var list = <String>[];

    var sentToPhase = false;

    await File(filename)
        .openRead()
        .map(utf8.decode)
        .transform(LineSplitter())
        .forEach((l) async {
      list.add(l);
      print('$l linecount:$lineCount');
      lineCount--;

      if (lineCount == 0) {
        lineCount = MERGE_SIZE;
        instance++;
        sentToPhase = true;
        await savePhase(phaseDirectory, 1, instance, list, lineDelimiter);
        list.clear();
        print('savePhase completed');
      }
    });

输出

9 line linecount:3
8 line linecount:2
7 line linecount:1
6 line linecount:3
5 line linecount:2
4 line linecount:1
3 line linecount:3
2 line linecount:2
1 line linecount:1
savePhase completed
savePhase completed
savePhase completed

这与openRead用于传递读取行的流有关吗?

我以为我已经想通了,但显然不是:)

1 个答案:

答案 0 :(得分:0)

未测试您的程序,但我可以确定您的问题是您希望forEach()方法在下一次调用之前等待每个Future完成,但情况并非如此。

尝试看一下以下解决方案,这些解决方案几乎都是相同的问题: Sequential processing of a variable number of async functions in Dart

相关问题