我需要从请求中保存响应变量,areaRequest是一个RequestContext,但是我无法保存并将其用于范围
Long temp;
areaRequest.countByCurrentInstitution().fire(new Receiver<Long>() {
@Override
public void onSuccess(Long response) {
temp = response;
}
});
答案 0 :(得分:1)
您不能在接收器内使用外部非最终变量。
为避免范围问题,快速而肮脏的变化将是:
final Long[] temp = {-1};
areaRequest.countByCurrentInstitution().fire(new Receiver<Long>() {
@Override
public void onSuccess(Long response) {
temp[0] = response;
}
});
doSomethingWith(temp[0]);
但这通常不是你想要做的。因为(if)countByCurrentInstitution()
是异步调用,所以temp[0]
在调用-1
时仍然是doSomethingWith()
,因为异步方法仍然在另一个线程中运行。登记/>
您可以通过使用简单的Thread.sleep()
或(yikes!)一个非常长的循环使主线程等待一下,但是,这只是一个快速的黑客并且容易出错(如果调用花费的时间比这长? )。
最好的选择是放弃Long temp
,只需在onSuccess()
方法中移动代码:
areaRequest.countByCurrentInstitution().fire(new Receiver<Long>() {
@Override
public void onSuccess(Long response) {
doSomethingWith(response);
}
});
答案 1 :(得分:-1)
好吧,在GWT工作了很多时间后,我发现的解决方案就是创建嵌套的异步调用。
areaRequest.countByCurrentInstitution().fire(new Receiver<Long>() {
@Override
public void onSuccess(Long response) {
// Here I pass the value from the first request
anotherRequest.anotherFunction(response).fire(new Receiver<Long>(){
@Override
public void onSuccess(Long new_response){ // Long again it could be anything it depends of your function
doWhateverYouWant(new_response)
}
});
}
});