gpt4 book ai didi

java - 由于返回太早,方法返回错误值

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

很抱歉这个奇怪的帖子标题,但我不知道如何比这更好地描述我的问题。

我目前正在开发一个使用 Microsoft Graph API 的 Java 项目(这是我第一次使用 Microsoft Graph API)。

我认为我的问题是 Java 的普遍问题。我有一个提供 Graph API 客户端的类,还有一个提供我想要使用 Graph API 执行的所有操作的类。具有操作方法的类应该将结果返回给客户端类。

一些代码。我的 Client 类(我调用操作的相关部分):

client = GraphServiceClientManager.getInstance().getGraphServiceClient();
Operations task = new Operations(client);
System.out.println(task.getUsernamebyUPN("USER UPN"));

我的操作类:

public String username = "0";

public String getUsernamebyUPN(String UPN) {
client.users(UPN).buildRequest().get(new ICallback<User>() {
@Override
public void success(User user) {
username = user.displayName;

}

@Override
public void failure(ClientException ex) {
ex.printStackTrace();
}
});
return username;
}

所以问题是,当我运行代码时,它将返回值为 0 的用户名,而不是我想要的用户名。返回后用户名变量将被更改。

如果我在“username = user.displayName;”下添加一个System.out.prntln(username)成功方法中的行我的输出将是:

0
The username I want

如何解决这个问题?您需要更多代码吗?

非常感谢您的帮助。 :)

最佳答案

该值将异步返回到回调函数,但您可以强制程序在需要该值时等待返回。一种方法是返回一个值持有者类,当您尝试获取该值时该类会阻塞,直到该值被设置为止,并且回调会设置该值。

例如,下面的类使用 Phaser 来控制这种等待行为:

import java.util.concurrent.ExecutionException;
import java.util.concurrent.Phaser;

public class FutureValue<T> {

private T value = null;
private Exception ex = null;
private Phaser phaser = new Phaser(1);

/**
* Get blocks until a value or an exception is set, after that it always
* returns immediately
*
* @return the value
* @throws ExecutionException
*/
public T get() throws ExecutionException {
phaser.register();
phaser.arriveAndAwaitAdvance();
if (ex != null) {
throw new ExecutionException(ex);
}
return value;
}

/**
* Sets the value and unblocks awaiting threads
*
* @param val
*/
public void set(T val) {
this.value = val;
phaser.forceTermination();
}

/**
* Sets an exception and unblocks awaiting threads
*/
public void setException(InterruptedException ex) {
this.ex = ex;
phaser.forceTermination();
}
}

您可以更改方法以返回 FutureValue:

    public FutureValue<String> getUsernamebyUPN(String UPN) {

final FutureValue<String> future = new FutureValue<String>();
client.users(UPN).buildRequest().get(new ICallback<User>() {
@Override
public void success(User user) {
future.set(user.displayName);
}

@Override
public void failure(ClientException ex) {
future.setException(ex);
}
});
return future;
}

另一种选择是更改逻辑,不获取值,而是观察事件,并通过回调发送事件。

关于java - 由于返回太早,方法返回错误值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56247145/

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