You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将console.log(html)结果存入变量用于HTML展示?

解决RTF转HTML结果存入变量的问题

问题根源

你之前尝试用return和arguments没生效,核心原因是runRtfjs内部的RTF解析、渲染都是异步操作(比如doc.render()返回Promise、JSDOM加载脚本也是异步流程),同步的返回方式根本拿不到异步执行后的结果。

解决方案

方案1:在现有回调中直接存储并处理

如果后续的HTML展示逻辑可以放在回调函数内执行,直接在回调里把html存入变量即可:

// 定义变量存储结果
let renderedHtml;

runRtfjs(
    filertf,
    (meta, html) => {
        // 将html存入变量
        renderedHtml = html;
        console.log("已存储的HTML内容:", renderedHtml);
        // 在这里直接编写后续展示逻辑
        // 浏览器环境示例:document.getElementById('target').innerHTML = renderedHtml;
        // Node环境生成HTML文件示例:require('fs').writeFileSync('result.html', renderedHtml);
    },
    error => console.error(error)
);

注意:由于是异步操作,不能在回调函数外部直接访问renderedHtml,必须等回调执行完成后才能拿到有效结果。

方案2:改造runRtfjs为Promise(推荐,逻辑更清晰)

把runRtfjs改造成返回Promise的形式,就能用async/await语法像同步代码一样获取结果:

// 修改runRtfjs函数,返回Promise
function runRtfjs(rtf) {
    return new Promise((resolve, reject) => {
        const virtualConsole = new jsdom.VirtualConsole();
        virtualConsole.sendTo(console);

        new JSDOM(`
        <script src="./node_modules/rtf.js/dist/WMFJS.bundle.js"></script>
        <script src="./node_modules/rtf.js/dist/EMFJS.bundle.js"></script>
        <script src="./node_modules/rtf.js/dist/RTFJS.bundle.js"></script>

        <script>
            RTFJS.loggingEnabled(false);
            WMFJS.loggingEnabled(false);
            EMFJS.loggingEnabled(false);

            try {
                const doc = new RTFJS.Document(rtfFile);
                const meta = doc.metadata();
                doc.render().then(function(htmlElements) {
                    const div = document.createElement("div");
                    div.append(...htmlElements);
                    window.done(meta, div.innerHTML);
                }).catch(error => window.onerror(error))
            } catch (error){
                window.onerror(error)
            }
        </script>
        `, {
            resources: "usable",
            runScripts: "dangerously",
            url: "file://" + __dirname + "/",
            virtualConsole,
            beforeParse(window) {
                window.rtfFile = stringToArrayBuffer(rtf);
                window.done = function (meta, html) {
                    resolve({ meta, html });
                };
                window.onerror = function (error) {
                    reject(error);
                };
            }
        });
    });
}

// 使用async/await获取并存储结果
async function getRenderedHtml() {
    try {
        const { meta, html } = await runRtfjs(filertf);
        // 存入变量
        const renderedHtml = html;
        console.log("已存储的HTML内容:", renderedHtml);
        // 后续展示逻辑写在这里
        // 示例:document.body.innerHTML = renderedHtml;
    } catch (error) {
        console.error(error);
    }
}

// 执行函数
getRenderedHtml();

这种方式更符合现代JavaScript异步编程的习惯,代码逻辑更直观,也方便后续扩展其他操作。

内容的提问来源于stack exchange,提问作者Flávio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 05:33:12