Работа с обещаниями в J2V8

Я пытаюсь использовать пакет inline-css NPM в проекте Java через J2V8, чтобы встроить таблицы стилей в атрибуты стиля.

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, это также будет полезно. Те, с которыми я сталкивался до сих пор, на самом деле не работают надежно, когда у вас есть несколько классов и идентификатор элементов. CSSBox выглядел как многообещающее решение, но, похоже, он неправильно обрабатывает правила с префиксами поставщика.

Альтернативой может быть использование сценария CLI, но это последнее средство для меня, поскольку это будет означать, что мне также необходимо развернуть NodeJS рядом с моим Java-приложением.

1 ответ

Решение

Вы должны прокачать цикл сообщений Node.js:

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

Добавьте это в конец вашего кода, и оно должно работать. Также я заметил, что у вас есть onSuccess(c)Я думаю, что c должен быть pageContent.

Другие вопросы по тегам