dart 未来的Map在等着你吗?

3bygqnnd  于 2023-09-28  发布在  其他
关注(0)|答案(1)|浏览(64)

downloadfile被声明为void。当foreach-loop downloadfile(...)结束时,应该执行函数encode()。怎么做?

void main() async {
  List<String> urld;
  urld = await get_vid();
  await Future.wait(urld.asMap(), (i, s) async {await downloadfile(s, i.toString());})  // doens't work
  urld.asMap().forEach((i, s) {downloadfile(s, i.toString());}); // the original
  encode();  // should only be executed if all downloadfile-threads are finished.
}
kpbwa7wx

kpbwa7wx1#

你不能这么做。
如果downloadfile返回void,并且不接受任何回调作为参数,那么就没有办法知道它何时完成,因为它没有告诉。(除非它是完全同步的,在这种情况下,它在返回时完成。既然你问了,我假设情况不是这样的。)
您不应该假设它实际上返回类型为voidFuture。它可能会,也可能会在明天停止这样做。不要试图在void面纱后面寻找,这是为了保护你自己。
因此,您需要更改downloadfile以返回一个Future,该Future在完成时完成,或者接受一个类似, {void Function()? onDone}的回调,该回调在完成时被调用。前者返回一个Future,更可取,因为它与语言await特性一起工作。
假设情况是这样的,那么:

await urld.indexed.map((p) => downloadFile(p.$2, p.$1.toString())).wait;

await urld.asMap.entries.map((e) => downloadFile(e.value, p.key.toString())).wait;

应该可以。

相关问题