NWJS, Electron - DOM не обновляется во время длительного процесса - PullRequest
0 голосов
/ 10 мая 2019

Как и в этом неотвеченном вопросе , у меня длительный процесс, в течение которого я хочу обновить HTML-код единственного окна приложения, но DOM не обновляется до тех пор, пока вышеуказанный процесс завершен.

Это касается как NW, так и Electron.

Код вызывается , потому что та же самая процедура также регистрируется в console - доступ через экземпляр window, переданный процессу, который находится в модуле Node.

Я не могу найти документацию, которая ссылается на такие проблемы, и нет флага Chromium, который мог бы помочь.

При использовании setInterval для заполнения innerText элемента временем каждой секунды обновления прекращаются во время длительного анализа файла.

Редактировать: этот вопрос - мой первый результат в поиске Google по запросу "NWJS не обновляет DOM" ....

1 Ответ

0 голосов
/ 17 мая 2019

Длительные процессы, которые блокируют основной процесс 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, это может быть доступ к DOM через window, переданный от средства визуализации.

...