我正在使用 d3 力定向图来显示从 API 获得的一些数据。在我可以显示它之前,它会运行一个 java 类,该类会将其写入正确的 json 格式。
由于程序在 JavaFX WebView 中运行,我有一个桥接类,它确实有一个我可以从 JavaScript 调用的 getter 方法。
在我的主类中,我创建一个 WebView 并将桥分配给它。我初始化 JSON 转换器并将桥传递给它。
@Override
public void start(Stage stage) {
try {
new JsonTranslator(individual, depth, bridge);
Scene scene = createScene();
[...]
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
private Scene createScene() {
[...]
try {
JSObject jsobj = (JSObject) webEngine.executeScript("window");
jsobj.setMember("java", bridge);
} catch (Exception e) {
e.printStackTrace();
}
[...]
}
在我的 JSONTranslator 类中,我编写 json 并将其传递给桥
private void writeFile() {
try {
bridge.setJSONObject(obj.toJSONString());
FileWriter file = new FileWriter(
"C://path/to/some/file.json"
file.write(obj.toJSONString());
file.flush();
file.close();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Object:" + obj);
}
我还将其写入文件。数据按预期打印。现在,在我的桥中,数据在整个 getter/setter 中都可用。在 JSToFXBridge.java 中:
public String getJSONObject(){
System.out.println("get request: " + json);
return json;
}
public void setJSONObject(String string){
this.json = string;
}
现在我从 JavaScript 中调用它
[...]
var draw = function(json, callback) {
[...]
callback.call(data);
};
var data = java.getJSONObject();
draw(data);
但是它确实在控制台上打印 get request: -my json data-
,json 字符串完全没问题。如果我从控制台复制并粘贴它,就像代码中的 var data = -my json data-
一样,它就可以工作。仅从方法中直接指定它是行不通的。我不明白为什么,因为我尝试异步加载它。基于this tutorial 。我在拉绳子时犯了错误吗?或者说这是一种错误的做法?
最佳答案
可以找到异步 JavaScript 回调的良好答案/教程 here 。解决方案,产生了一个新问题[也已解决],提供here 。 一般来说,考虑一下这种模式:
function addOne(thenRunThisFunction) {
waitAMinuteAsync(function waitedAMinute() {
thenRunThisFunction()
})
}
addOne(function thisGetsRunAfterAddOneFinishes(){})
解释得很好
关于javascript - 异步 JSON 字符串加载 JavaScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33868755/