在方法声明中访问变量

4

我正在使用GWT编写一个servlet,但我并不真正理解在函数中声明为全局变量的数据变量发生了什么。也许这是一个更普遍的Java问题,涉及将变量用于动态函数声明,但我找不到答案。

这是我的代码:

private AbstractDataTable fetchDataFromServer() {

    final DataTable data = DataTable.create();
    System.out.println("1 Table has " + data.getNumberOfColumns() + " columns");
    System.out.println("1 Table has " + data.getNumberOfRows() + " rows");

    try {

        RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, "/mongo.json");

        rb.setCallback(new RequestCallback() {
            @Override
            public void onResponseReceived(Request request, Response response) {
                JSONValue value = JSONParser.parse(response.getText());
                JSONObject productsObj = value.isObject();          
                JSONArray radiation = productsObj.get("ShortWave_Rad").isArray();

                if (radiation != null) {

                    data.addColumn(ColumnType.NUMBER, "Horizon");
                    data.addColumn(ColumnType.NUMBER, "Value");

                    System.out.println("Values " + radiation.size());

                    for (int i=0; i<=radiation.size()-1; i++) {

                        JSONObject productObj = radiation.get(i).isObject();
                        data.addRows(radiation.size());
                        data.setValue(i, 0, productObj.get("horizon").isNumber().doubleValue());
                        data.setValue(i, 1, productObj.get("value").isNumber().doubleValue());      
                    }

                    System.out.println("2 Table has " + data.getNumberOfColumns() + " columns");
                    System.out.println("2 Table has " + data.getNumberOfRows() + " rows");      

                }
            }
            @Override
            public void onError(Request request, Throwable exception) {
                Window.alert("Error occurred" + exception.getMessage());
            }
        });
        rb.send();

    } 
    catch (RequestException e) {
        Window.alert("Error occurred" + e.getMessage());
    }

    System.out.println("3 Table has " + data.getNumberOfColumns() + " columns");
    System.out.println("3 Table has " + data.getNumberOfRows() + " rows");

    return data;
}

以下是我得到的输出结果:

1个表格有0列

1个表格有0行

2个表格有2列

2个表格有10行

3个表格有0列

3个表格有0行

在onResponseReceived声明使用数据后,数据内容去哪了呢?

非常感谢您的帮助。


你期望得到什么样的输出,和实际输出有何不同? - Bob Gilmore
1个回答

2
您的onResponseReceived会在异步调用响应之后被调用。很可能在它接收到响应之前,下面的语句已经被执行了。
System.out.println("3Table has colums " + data.getNumberOfColumns());
System.out.println("3Table has rows " + data.getNumberOfRows());

在最后打印大小之前,使用一些状态标志来检查回调函数的状态。


1
不仅是“可能”,而是肯定的:GWT强制转换为JavaScript,而JavaScript在UI线程中运行,因此在“3 Table has”行之前没有办法调用回调函数:UI线程仍然忙碌,即使响应已经存在,回调函数也至少被延迟到代码产生后。 - Thomas Broyer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接