我正在使用GWT,我有一个从Java类调用的本机函数,它有一些代码,它需要几秒钟才能生成结果并将其返回给java代码。但不幸的是,由于本机函数在内部服务响应之前返回,它返回空白。
这是代码
此函数从Java类调用。
public static native String getChartPng(int indexing)/*-{
var result;
//getPngBase64String(onSuccess, onError, width, height, img quality)
if($wnd.chartings[indexing]){
$wnd.chartings[indexing].getPngBase64String(function(response){
//it takes couple of seconds
result = response;
},null,450,600,1);
}
return result
}-*/;
所以当我调用这个函数时,我得到了空字符串。我是如何使用此代码获得结果的?
答案 0 :(得分:1)
我猜您正在使用AnyChart
。这是getPngBase64String reference。
此方法是异步的,这意味着无需等待方法完成即可继续执行代码。这就是为什么下一个声明:return result
会被立即调用,而未指定result
。
前两个参数中的getPngBase64String
方法采用在方法执行以成功(第一个回调)或失败(第二个回调)结束时调用的回调函数。您只能在onSuccess
回调中使用结果。
所以你需要考虑这样的异步方法:去为我做点什么,让我知道你什么时候完成。通过在成功(或失败)时调用回调函数,该方法将通知您。
所以你不能只返回结果。相反,你应该在回调函数中对结果做一些事情。
答案 1 :(得分:0)
如果你真的想要返回结果,你需要作弊。但首先我需要说这是错误的方式,你真的应该考虑修改你的方法。
您可以使用一些标志来等待结果。像这样:
public static native String getChartPng(int indexing) /*-{
var result_ready = false;
var result;
//getPngBase64String(onSuccess, onError, width, height, img quality)
if($wnd.chartings[indexing]){
$wnd.chartings[indexing].getPngBase64String(function(response){
//it takes couple of seconds
result = response;
result_ready = true;
}, null, 450, 600, 1);
}
while(!result_ready); // do nothing, wait for the result - notice the `;`
return result
}-*/;
这称为busy waiting,您应该避免这种情况。