从Future实例中获取数值[英] Getting values from Future instances

本文是小编为大家收集整理的关于从Future实例中获取数值的处理方法,想解了从Future实例中获取数值的问题怎么解决?从Future实例中获取数值问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我的数据是这样的:

{
  "five": {
    "group": {
      "one": {
        "order": 2
      },
      "six": {
        "order": 1
      }
    },
    "name": "Filbert",
    "skill": "databases"
  },
  "four": {
    "group": {
      "three": {
        "order": 2
      },
      "two": {
        "order": 1
      }
    },
    "name": "Robert",
    "skill": "big data"
  },
  "one": {
    "name": "Bert",
    "skill": "data analysis"
  },
  "seven": {
    "name": "Colbert",
    "skill": "data fudging"
  },
  "six": {
    "name": "Ebert",
    "skill": "data loss"
  },
  "three": {
    "name": "Gilbert",
    "skill": "small data"
  },
  "two": {
    "name": "Albert",
    "skill": "non data"
  }
}

我正在使用以下功能:

  Future retrieve(String id) async {
    Map employeeMap = await employeeById(id); //#1
    if (employeeMap.containsKey("group")) { //#2
      Map groupMap = employeeMap["group"];
      Map groupMapWithDetails = groupMembersWithDetails(groupMap); #3
      // above returns a Mamp with keys as expected but values 
      // are Future instances.
      // To extract values, the following function is
      // used with forEach on the map
      futureToVal(key, value) async { // #4
        groupMapWithDetails[key] = await value; 
      }
      groupMapWithDetails.forEach(futureToVal); // #4
    }
    return groupMapWithDetails;
   }
  1. 我从数据库(Firebase)访问员工(作为A Map)
  2. 如果员工是领导者(具有密钥"组")
  3. 我通过调用单独的函数从数据库中填写的组中每个员工的详细信息.
  4. 由于该函数返回具有Future实例的值的映射,因此我想从它们中提取实际值.为此,A forEach在地图上调用. 但是,我只会将未来作为价值观.

如何获得实际值?

推荐答案

无法从异步执行中返回同步执行.

从Future获得一个值

有两种方式

将回调转到then(...)

theFuture.then((val) {
  print(val);
});

或使用async/await对noter语法

Future foo() async {
  var val = await theFuture;
  print(val);
}

其他推荐答案

您不是在等待await value表达式完成.

forEach呼叫通过地图条目运行,并为每个呼叫启动一个异步计算.然后删除该计算的未来,因为forEach不使用其函数的返回值. 然后,您在任何异步计算完成之前返回地图,因此地图中的值仍然是期货.他们最终会更改为非未来,但是您不会知道何时完成.

而不是forEach呼叫,尝试:

await Future.wait(groupMapWithDetails.keys.map((key) async {
  groupMapWithDetails[key] = await groupMapWithDetails[key];
});

这为地图中的每个键执行异步操作,并等待所有键都可以完成.之后,地图应具有非未来值.

本文地址:https://www.itbaoku.cn/post/1793884.html