gpt4 book ai didi

java - 等待异步回调完成并传递值

转载 作者:行者123 更新时间:2023-12-02 11:09:26 25 4
gpt4 key购买 nike

我有以下代码片段:

private ValContainer<CompletableFuture<String>> valContainer = new ValContainer<>();

public void fetchAsync(final String attrName) {

QueryAsyncCallback asyncCallback = new QueryAsyncCallback() {
@Override
public void onSuccess(Message response) {
final Data value = response.results().get("value");
String text = value.toString();
CompletableFuture<String> result = CompletableFuture.completedFuture(text);
valContainer.setVal(result);
}

@Override
public void onError(CallbackError error) {
LOG.info("Error occurred");
}

@Override
public void onTimeout() {
LOG.info("Timeout occurred");
}
};

Message request = new Messsage("com.example.val", "local", 0, "fetch");
request.parameters().put("name", attrName);

MsgOptions options = new MsgOptions(5000);
try {
queue.query(request, options, asyncCallback);
} catch (QueueAccessException e) {
e.printStackTrace();
}
}

现在,我可以轻松获取在 onSuccess() 回调中查询的值。 ValContainer 只是一个通用容器,以便我可以将值保存在匿名类中。不幸的是,在 Main 函数中,我尝试访问此 valContainer 但遗憾的是,由于这是异步查询,我收到 NullPointerException。

...
((JavaServiceImpl) javaService).fetchAsync("test");
System.out.println("inMain value: " + ((JavaServiceImpl) javaService).getValContainer().getVal().get()); <-- this is going to be NullPointerException
...

然后 100 毫秒后,我在 onSuccess() 方法中获取值。这里基本上做 Thread.sleep(100) 足以获取我希望获得的值,但我真的不想阻塞线程。有没有一种方法可以简洁地做到这一点?

最佳答案

不要离开val未初始化于 ValContainer 。初始化为new CompletableFuture<>()

private ValContainer<CompletableFuture<String>> valContainer = new ValContainer<>(new CompletableFuture<>());


public class ValContainer<T> {
T val;

public ValContainer(T val) {
this.val = val;
}
}

然后更改您的onSuccess方法为

String text = value.toString(); 
valContainer.getVal().complete(text);

您不需要创建 CompletableFutureonSuccess方法。

有了这个,[..]getValContainer().getVal().get()阻塞直到 future 完成。

关于java - 等待异步回调完成并传递值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50699371/

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