JSNI超时后返回



我正在使用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
}-*/;

这叫做忙等待,你应该避免。

相关内容

  • 没有找到相关文章

最新更新