在下面的代码中,我找不到等待内部异步代码的解决方案。结果是数据总是返回空。有什么想法吗?
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;
}
答案 0 :(得分:1)
之所以不起作用,是因为您的内部函数正在返回您从未等待的Future对象。
如果将代码修改为以下内容,它应该可以工作:
import pandas as pd
def build_df():
build_df = {' month': ['Jan', 'Jan' ,'Jan','Jan','Jan','Jan', 'Feb', 'Feb', 'Feb'], ' city' : ['Toronto', 'Montreal', 'Ottawa', 'Vancouver', 'Toronto', 'Montreal', 'Toronto', 'Montreal', 'Montreal'],' product_name' : ['bread','bread','bread','bread','cheese', 'cheese', 'bread', 'bread', 'cheese'], ' sales' : [190, 210,190,210,310,510,230,220,310] }
print (pd.DataFrame(build_df))
因此,我不使用forEach,而是在可迭代的条目上使用map方法将每个条目映射到Future对象。当我把所有这些Future对象放到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;
}
中并返回一个Future时,当所有其他Future对象都返回其值时,就完成了。