飞镖流和等待中

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

我在理解以下代码流程时遇到麻烦。该代码应处理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用于传递读取行的流有关吗?

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

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

dart async-await stream
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.