NWJS,Electron-长时间运行过程中DOM不更新

时间:2019-05-10 14:01:04

标签: electron nwjs

就像this unanswered question一样,我有一个长期运行的过程,在此过程中,我希望更新该应用程序唯一窗口的HTML,但是直到上述过程完成后,DOM才会更新

NW和Electron都是这种情况。

正在调用代码 ,因为同一例程还记录到console-通过传递给流程的window实例进行访问,该实例位于节点模块。

我找不到引用此类问题的文档,也找不到可能有用的Chromium标志。

使用setInterval每秒填充一次元素的innerText时,更新会在长时间运行的文件分析过程中停止。

编辑:这个问题是我在Google搜索“ NWJS not update DOM”时的第一个结果。...

1 个答案:

答案 0 :(得分:0)

长时间运行的进程会阻塞Chromium主进程,也会阻塞渲染器。

解决方案是创建一个单独的进程,并使其通过IPC将状态更新发送回渲染器:

        this._service = fork(
            path.join(__dirname, 'service'),
            [],
            { stdio: ['inherit', 'inherit', 'inherit', 'ipc'] }
        );

        this._service.on('error', (err) => {
            console.log('child error', err);
        });

        this._service.on('message', msg => {
            console.log('message from child:', msg);
            switch (msg.cmd) {
                case 'hello':
                    console.log('hello from parent');
                    break;
                case 'log':
                    this.parentLog(msg.html);
                    break;
                case 'progress':
                    this.progressBar.update(msg.pc);
                    break;
            }
        });

在产生的子进程(在上例中为service.js)中,使用process.send将JSON传输到父级:

const childLog = (html) => {
    process.send({ cmd: 'log', html: html });
}

请注意,如果您的父母不是电子渲染器,则可能是通过从渲染器传递的window访问DOM。