我正在使用Rhino库在android中执行JavaScript函数。我有一个像javascript函数,
var exucuteJS = function(controlValues) {
var valueSelected = controlValues['country'];
valueSelected = valueSelected.toUpperCase();
switch (valueSelected) {
case "INDIA":
return "IND_HOME";
case "NEPAL":
return "NEP_HOME";
default:
return "DEF_HOME"
}
}
我将Java HashMap对象作为参数传递,比如将controlValues传递给函数executeJS。问题是,Rhino cant javascript代码,从密钥中获取值。
var valueSelected = controlValues['country'];
返回值未定义。
它适用于此行,
var valueSelected = controlValues.get('country');
但它不是有效的JavaScript代码。
同样的javascript将在android和iOS中执行。 iOS中不支持上述行。请建议。我使用的是最新版本的Rhino。
答案 0 :(得分:2)
最后我自己找到了答案。
不是将HashMap发送到javascript函数,而是需要将其作为JSONObject发送。不像普通的JSONObject对象,而是作为NativeJSON对象形式的Object。
Object nativeJsonObject= NativeJSON.parse(rhino,scope,controlValueJsonString,new NullCallable());
其中, rhino - Rhino的Context对象。 范围 - 可编写脚本的对象 controlValueJsonString - 等效于HashMap的JSON字符串。 (controlValueJsonString = new Gson()。toJson(hashMap);)
NullCallable是一个由Callable实现的类(来自rhino的包 org.mozilla.javascript.Callable)
这个' nativeJsonObject'应该传递给javascript函数。
Object[] params = new Object[] { controlValues };
来自JSON对象,javascript可以获取值,
var valueSelected = controlValues['country'];
这对我有用。真的我不知道为什么下来投票给这个问题。 管理员,请注意这个问题。
答案 1 :(得分:0)
访问复杂对象数据的唯一方法是使用其界面。您需要为Android和ios创建单独的解决方案。
typeof
运算符应该可以帮助您在这些情况之间切换。
答案 2 :(得分:0)
您不必实现NullCallable类的简单解决方案是
"table.file.replication": "2",
"table.compaction.minor.logs.threshold": "10",
"table.durability": "flush",
"table.file.max": "30",
"table.compaction.major.ratio": "9",
"table.split.threshold": "1G"
while the tablet server configuration is:
"tserver.wal.blocksize": "2G",
"tserver.walog.max.size": "8G",
"tserver.memory.maps.max": "32G",
"tserver.compaction.minor.concurrent.max": "50",
"tserver.compaction.major.concurrent.max": "8",
"tserver.total.mutation.queue.max": "50M",
"tserver.wal.replication": "2",
"tserver.compaction.major.thread.files.open.max": "15"
the tablet server heap has been set to 32GB
找到了