我在理解以下代码流程时遇到麻烦。该代码应处理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行,依此类推。...
未测试您的程序,但我相当确定您的问题是,您希望forEach()方法在下一次调用之前等待每个Future
完成,但情况并非如此。