Asynchronous 等待匿名函数

Asynchronous 等待匿名函数,asynchronous,dart,Asynchronous,Dart,在下面的代码中,我找不到等待内部异步代码的解决方案。结果是数据总是返回为空。有什么想法吗 Future<Map> resolveLinks(links) async { var data = {}; (links as Map).forEach((k, v) async { switch (v["type"]) { case "address": data[k] = await getAddress(v["value"]);

在下面的代码中,我找不到等待内部异步代码的解决方案。结果是数据总是返回为空。有什么想法吗

Future<Map> resolveLinks(links) async {
  var data = {};

  (links as Map).forEach((k, v) async {

    switch (v["type"]) {
      case "address":
      data[k] = await getAddress(v["value"]);
        break;
      case "person":
        data[k] = await getPerson(v["value"], v["subtype"]);
        break;
    }
  });
  return data;
}
未来解析链接(链接)异步{
变量数据={};
forEach((k,v)异步{
开关(v[“类型”]){
案例“地址”:
数据[k]=等待获取地址(v[“值”]);
打破
案例“人”:
数据[k]=等待getPerson(v[“值”],v[“子类型”]);
打破
}
});
返回数据;
}

这不起作用的原因是,您的内部函数正在返回您从未等待过的未来对象

如果您将代码修改为以下内容,它应该可以工作:

Future<Map> resolveLinks(links) async {
  var data = {};

  await Future.wait((links as Map).entries.map((entry) async {
    final k = entry.key;
    final v = entry.value;

    switch (v["type"]) {
      case "address":
        data[k] = await getAddress(v["value"]);
        break;
      case "person":
        data[k] = await getPerson(v["value"], v["subtype"]);
        break;
    }
  }));
  return data;
}
未来解析链接(链接)异步{
变量数据={};
wait Future.wait((链接为映射).entries.Map((条目)异步{
最终k=entry.key;
最终v=输入值;
开关(v[“类型”]){
案例“地址”:
数据[k]=等待获取地址(v[“值”]);
打破
案例“人”:
数据[k]=等待getPerson(v[“值”],v[“子类型”]);
打破
}
}));
返回数据;
}

因此,我没有使用forEach,而是对iterable条目使用map方法将每个条目映射到未来的对象中。当我获取所有这些未来对象并将它们放入
Future.wait
中时,当所有其他未来对象都返回其值时,将返回一个未来。

它应该可以正常工作,您是否尝试在循环中打印数据?打印是否正确?另外,您不应该强制转换links类型,只需在函数
Future resolveLinks(Map links)…中设置变量类型即可。
它不起作用。分步调试显示它返回数据,然后解析数据。它总是空的。