首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用J2V8中的承诺

使用J2V8中的承诺
EN

Stack Overflow用户
提问于 2016-07-26 15:17:59
回答 1查看 975关注 0票数 3

我试图通过内联-css项目中的Java包通过J2V8将样式表内联成样式属性。

代码语言:javascript
复制
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承诺?还是有人看到了错误?

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-26 20:39:57

您必须泵入Node.js消息循环:

代码语言:javascript
复制
while(nodeJS.isRunning()) {
  nodeJS.handleMessage();
}

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38593820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档