javascript - 在 J2V8 中使用 promise

标签 javascript java java-native-interface j2v8

我正在尝试使用 inline-css通过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) {
    //...
}

但是成功回调和错误回调都没有被调用,也没有抛出任何错误。我找不到任何适合 J2V8 的文档,提供的示例在这里也没什么用。有没有人使用 J2V8 来处理 JavaScript promises?或者有人看到错误?

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

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

最佳答案

您必须抽取 Node.js 消息循环:

while(nodeJS.isRunning()) {
  nodeJS.handleMessage();
}

将此添加到您的代码底部,它应该可以工作。另外,我注意到你有 onSuccess(c),我认为 c 应该是 pageContent

关于javascript - 在 J2V8 中使用 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38593820/

相关文章:

java - Thymeleaf 片段在方法执行之前加载

kotlin - Kotlin可空JNI类型

javascript - 使用 node.js 提供来自 Backbone.js 应用程序的内容以搜索爬虫以进行 SEO

java - 如何动态调用合格服务上的方法?

javascript - Ruby on Rails 使用 AJAX 更新列表打破了顺序

java - 设置Heroku模板java应用程序的开发环境

Java Native Access 不执行 C++,对吧?

android - cordova 插件中缺少 jni 文件夹

javascript - Bootstrap 表 : sort by date field

javascript - 如何获取 li 元素的最大宽度