【发布时间】:2020-01-01 18:07:17
【问题描述】:
我无法理解以下代码的流程。 代码应处理 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 用于传递读取行的流有关吗?
我以为我已经 await 想通了,但显然不是:)
【问题讨论】:
标签: dart async-await stream