NWJS、Electron - DOM 在 long-运行 过程中不更新
NWJS, Electron - DOM not updating during long-running process
就像在 this unanswered question 中一样,我有一个很长的 运行 过程,在此期间我希望更新应用程序唯一 window 的 HTML --但是 DOM 直到上述过程完成后才会更新。
NW 和 Electron 都是这种情况。
代码 被 调用,因为相同的例程也记录到 console
- 这是通过传递给进程的 window
实例访问,它在 Node 模块中。
我找不到任何引用此类问题的文档,也找不到可能有帮助的 Chromium 标记。
当使用 setInterval
用每秒的时间填充元素的 innerText
时,更新会在长时间 运行 文件解析过程中停止。
编辑:这个问题是我在 Google 搜索 'NWJS not updating DOM' 时的第一个结果......
Long-running 阻塞 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 });
}
请注意,如果您的父级不是 Electron 渲染器,它可能会通过渲染器传递的 window
访问 DOM。
就像在 this unanswered question 中一样,我有一个很长的 运行 过程,在此期间我希望更新应用程序唯一 window 的 HTML --但是 DOM 直到上述过程完成后才会更新。
NW 和 Electron 都是这种情况。
代码 被 调用,因为相同的例程也记录到 console
- 这是通过传递给进程的 window
实例访问,它在 Node 模块中。
我找不到任何引用此类问题的文档,也找不到可能有帮助的 Chromium 标记。
当使用 setInterval
用每秒的时间填充元素的 innerText
时,更新会在长时间 运行 文件解析过程中停止。
编辑:这个问题是我在 Google 搜索 'NWJS not updating DOM' 时的第一个结果......
Long-running 阻塞 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 });
}
请注意,如果您的父级不是 Electron 渲染器,它可能会通过渲染器传递的 window
访问 DOM。