我正在使用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
}-*/;
所以当我调用这个函数时,我得到了一个空白字符串。我如何从使用这段代码得到结果?
我猜你用的是AnyChart
。下面是getPngBase64String的引用。
这个方法是异步的,这意味着代码执行不需要等待方法完成。这就是为什么下一个语句:return result
被立即调用,而result
没有被赋值。
前两个参数中的getPngBase64String
方法采用回调函数,当方法执行以成功(第一次回调)或失败(第二次回调)结束时调用这些函数。您只能在onSuccess
回调中使用结果。
所以你需要考虑这样的异步方法:去为我做一些事情,当你完成的时候告诉我。该方法将在成功(或失败)时通过调用回调函数通知您。
所以你不能只返回结果。相反,您应该在回调函数中处理结果。
如果您真的想返回结果,则需要稍微欺骗一下。但首先我得说这是错误的方法,你真的应该考虑修改你的方法。
你可以使用一些标志来等待结果。这样的:
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
}-*/;
这叫做忙等待,你应该避免。