首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Uni.createFrom().future()并从封闭方法返回Uni?

如何使用Uni.createFrom().future()并从封闭方法返回Uni?
EN

Stack Overflow用户
提问于 2022-09-07 07:47:46
回答 1查看 98关注 0票数 2

我对Java和Mutiny非常陌生。

如下所示,我的测试函数向Redis询问键"foo“的值,即"bar”。这是可行的,而且未来的onCompleted()会得到"bar“。

到目前一切尚好。

我对Uni.createFrom().future()位有两个问题。

  1. 编译器说:The method future(Future<? extends T>) in the type UniCreate is not applicable for the arguments (Future<Response>)。我试过建议的解决办法,但最终陷在了一个更深的洞里。我的Java技能不足以完全理解错误的含义。
  2. 如何将"bar“从Uni<String>返回到test()?我已经尝试了各种订阅和CompletableFutures,无法使任何工作。我想,我需要返回一个函数来生成Uni,但是对于如何做到这一点却不知所措。
代码语言:javascript
复制
// The abbreviated setup
import io.vertx.redis.client.Redis;
private final Redis redisClient;
this.redisClient = Redis.createClient(vertx);


public Uni<String> test () {
  // Ask Redis for the value of key "foo" => "bar"
  Future<Response> futureResponse = this.redisClient.send(Request.cmd(Command.create("JSON.GET")).arg("foo"))
      .compose(response -> {
        // response == 'bar'
        return Future.succeededFuture(response);
      }).onComplete(res -> {
        // res == 'bar'
      });

  // How to make the return of the Uni<String> wait for the completed futureResponse 
  // so it makes a Uni<String> from "bar" and returns it from the method?
  Uni<String> respUni = Uni.createFrom().future(futureResponse);

  return respUni;
}

谢谢。感谢您的任何建议!(是的,我花了很多时间为自己解决这个问题);

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-07 08:34:09

由于错误,更新了帖子。

UniCreate.future()接受某种类型的java.util.concurrent.Future,并返回相同类型的Uni。也就是说,您必须传递一个java.util.concurrent.Future<String>才能得到一个Uni<String>

Redis客户端的send方法返回一个与io.vertx.core.Future<Response>不兼容的赋值。

幸运的是,API提供了io.vertx.core.Future#toCompletionStage来将vertx转换为JDK CompletionStage,而Mutiny提供了UniCreate.completionStage()来完成工作。

代码语言:javascript
复制
public Uni<String> test () {
  Future<String> futureResponse = this.redisClient.send(Request.cmd(Command.create("JSON.GET")).arg("foo"))
      .compose(response -> {
        return Future.succeededFuture(response.toString());
      });

  Uni<String> respUni = Uni.createFrom().completionStage(futureResponse.toCompletionStage());

  return respUni;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73631825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档