超时后JSNI返回

时间:2016-11-07 08:36:13

标签: java gwt return timeout response

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

所以当我调用这个函数时,我得到了空字符串。我是如何使用此代码获得结果的?

2 个答案:

答案 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,您应该避免这种情况。