gpt4 book ai didi

dart - 链接Dart future -可以获取中间结果吗?

转载 作者:行者123 更新时间:2023-12-04 07:22:52 25 4
gpt4 key购买 nike

Dart允许chaining futures依次调用多个异步方法,而无需嵌套回调,这真棒。

假设我们要先连接到像Redis这样的数据存储,然后运行一系列顺序读取:

  Future<String> FirstValue(String indexKey)
{
return RedisClient.connect(Config.connectionStringRedis)
.then((RedisClient redisClient) => redisClient.exists(indexKey))
.then((bool exists) => !exists ? null : redisClient.smembers(indexKey))
.then((Set<String> keys) => redisClient.get(keys.first))
.then((String value) => "result: $value");
}

四种异步方法,但是代码相当容易阅读和理解。看起来这些步骤似乎是按顺序同步执行的。美丽的! (想象一下必须使用嵌套的JavaScript回调编写相同的代码...)

不幸的是,这还行不通:我们从 .connect方法获得的RedisClient仅分配给一个本地变量,该本地变量不在后续 .then的范围内。因此, redisClient.smembersredisClient.get实际上将引发空指针异常。

明显的解决方法是将返回值保存在具有函数作用域的另一个变量中:

  Future<String> FirstValue(String indexKey)
{
RedisClient redisClient = null;
return RedisClient.connect(Config.connectionStringRedis)
.then((RedisClient theRedisClient)
{
redisClient = theRedisClient;
return redisClient.exists(indexKey);
})
.then((bool exists) => !exists ? null : redisClient.smembers(indexKey))
.then((Set<String> keys) => redisClient.get(keys.first))
.then((String value) => "result: $value");
}

不幸的是,这使代码更冗长,更不美观:现在有了一个附加的帮助程序变量(theRedisClient),我们不得不用一个匿名函数替换其中一个Lambda表达式,并添加了一对花括号,一个 return语句和另一个分号。 。

由于这似乎是一种常见的模式,是否有更优雅的方法可以做到这一点?有什么方法可以访问这些更早的中间链?

最佳答案

您可以使用嵌套分配来避免花括号和return:

.then((RedisClient rc) => (redisClient = rc).exists(indexKey))

关于dart - 链接Dart future -可以获取中间结果吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22082073/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com