Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在J2V8中使用承诺_Javascript_Java_Java Native Interface_J2v8 - Fatal编程技术网

Javascript 在J2V8中使用承诺

Javascript 在J2V8中使用承诺,javascript,java,java-native-interface,j2v8,Javascript,Java,Java Native Interface,J2v8,我试图通过J2V8在Java项目中使用NPM包将样式表内联到样式属性中 final NodeJS nodeJS = NodeJS.createNodeJS(); final V8Object inlineCss = nodeJS.require(new File( "path/to/node_modules/inline-css/index.js" )); final V8 jsRuntime = nodeJS.getRuntime(); final Map<String, Ob

我试图通过J2V8在Java项目中使用NPM包将样式表内联到样式属性中

final NodeJS nodeJS = NodeJS.createNodeJS();
final V8Object inlineCss = nodeJS.require(new File(
    "path/to/node_modules/inline-css/index.js"
));
final V8 jsRuntime = nodeJS.getRuntime();

final Map<String, Object> inlineOptions = new HashMap<>();
inlineOptions.put("applyLinkTags", false);
inlineOptions.put("removeStyleTags", false);
inlineOptions.put("url", "http://example.com");

jsRuntime.add("inlineCss", inlineCss);
jsRuntime.add("inlineOptions", V8ObjectUtils.toV8Object(jsRuntime, inlineOptions));

try (FileInputStream inputStream = new FileInputStream(pageFile)) {
    byte[] data = new byte[(int) pageFile.length()];
    inputStream.read(data);

    String pageContent = new String(data, "UTF-8");

    JavaVoidCallback successCallback = new JavaVoidCallback() {
        @Override
        public void invoke(V8Object v8Object, V8Array v8Array) {
            //...
        }
    };

    JavaVoidCallback errorCallback = new JavaVoidCallback() {
        @Override
        public void invoke(V8Object v8Object, V8Array v8Array) {
            //...
        }
    };

    jsRuntime.add("pageContent", pageContent);
    jsRuntime.registerJavaMethod(successCallback, "onSuccess");
    jsRuntime.registerJavaMethod(errorCallback, "onError");

    jsRuntime.executeObjectScript("inlineCss(pageContent, inlineOptions).then(onSuccess).catch(onError)");
} catch (IOException | V8ScriptExecutionException | V8ScriptCompilationException e) {
    //...
}
final NodeJS NodeJS=NodeJS.createNodeJS();
最终V8Object inlineCss=nodeJS.require(新文件(
“path/to/node_modules/inline css/index.js”
));
final V8 jsRuntime=nodeJS.getRuntime();
final Map inlineOptions=new HashMap();
inlineOptions.put(“applyLinkTags”,false);
inlineOptions.put(“removeStyleTags”,false);
inlineOptions.put(“url”http://example.com");
jsRuntime.add(“inlineCss”,inlineCss);
add(“inlineOptions”,V8ObjectUtils.toV8Object(jsRuntime,inlineOptions));
try(FileInputStream-inputStream=newfileinputstream(pageFile)){
字节[]数据=新字节[(int)pageFile.length()];
读取(数据);
字符串页面内容=新字符串(数据,“UTF-8”);
JavaVoidCallback successCallback=新建JavaVoidCallback(){
@凌驾
公共void调用(V8Object V8Object,V8Array V8Array){
//...
}
};
JavaVoidCallback errorCallback=新建JavaVoidCallback(){
@凌驾
公共void调用(V8Object V8Object,V8Array V8Array){
//...
}
};
jsRuntime.add(“pageContent”,pageContent);
registerJavaMethod(successCallback,“onSuccess”);
registerJavaMethod(errorCallback,“onError”);
jsRuntime.executeObjectScript(“inlineCss(pageContent,inlineOptions).then(onSuccess.catch(onError)”);
}捕获(IOException | V8ScriptExecutionException | V8ScriptCompliationException e){
//...
}
但不会调用成功回调或错误回调,也不会抛出错误。我找不到任何适合J2V8的文档,这里提供的示例并没有真正的帮助。有人使用J2V8来处理JavaScript承诺吗?还是有人看到了错误

另外,如果您知道一个内联CSS的好Java库,这也会很有帮助。当您有多个类并且元素上有一个id时,我到目前为止遇到的这些类实际上不能可靠地工作。CSSBox看起来是一个很有前途的解决方案,但它似乎无法正确处理供应商前缀规则


另一种选择是使用CLI脚本,但这是我最后的选择,因为这意味着我还需要在Java应用程序旁边部署NodeJ。

您必须启动Node.js消息循环:

while(nodeJS.isRunning()) {
  nodeJS.handleMessage();
}
将此添加到代码的底部,它应该可以工作。另外,我注意到你有
onSuccess(c)
,我认为c应该是pageContent