等待匿名功能

时间:2019-11-26 18:00:32

标签: 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"]);
        break;
      case "person":
        data[k] = await getPerson(v["value"], v["subtype"]);
        break;
    }
  });
  return data;
}

1 个答案:

答案 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对象都返回其值时,就完成了。