我有一個電子/ node.js應用程序,我遇到了麻煩。具體來說,我需要通過更新DOM中的元素,向用戶提供一些有關同步產生長循環進度的反饋。但是,實際顯示的內容在循環過程中不會改變。整個循環完成後,該元素將使用最終的max
索引值進行更新。DOM重繪被childProcess.spawnSync阻止
function dosomething(index,callback) {
childProcess.spawnSync('app1',... //takes 1 second
childProcess.spawnSync('app2',... //takes 6 seconds, depends on app1 running 1st
console.log('working on: ' + index);
callback(index);
}
function dosomethingelse(index) {
$('#somediv').html(index); //update progress bar
console.log('displaying: ' + $('#somediv').html());
}
for(var i=0; i<max; i++){ //max is usually 10-100, loop takes 1 to 10 minutes
dosomething(i,dosomethingelse);
}
當我轉儲進度HTML到控制檯,它不與指數的回調增加:
CONSOLE:
working on: 0
displaying: 0
working on: 1
displaying: 1
working on: 2
displaying: 2
...
另外,我還試圖強行通過運行下面的代碼沒有重繪DIV果:
function dosomethingelse(index) {
$('#somediv').html(index); //update progress bar
console.log($('#somediv').html());
//REDRAW
document.getElementById("somediv").innerHTML =num;
document.getElementById("somediv").style.display = 'none';
document.getElementById("somediv").offsetHeight;
document.getElementById("somediv").style.display = 'block';
}
從我已閱讀,使用spawnSync使得在阻塞的NodeJS我的模式二進制程序運行。這直接針對節點的非阻塞核心,但在我的情況下絕對必要,因爲我的命令行調用運行了6秒,並且佔用了接近100%的CPU。如果我使用標準的異步產卵,我最終會同時運行50%100%的進程,幾分鐘後同時完成。同樣,沒有向用戶提供進度反饋。我不明白爲什麼我的回調沒有完成。如果我切換功能,以便首先調用dosomethingelse
,回調爲dosomething
,但我仍然沒有得到DOM更新。其他
兩件事情我已經嘗試:npm sleep:
dosomething(i);
var sleep = require('sleep');
sleep.usleep(100);
dosomethingelse(i);
而且deasync:
var deasync = require('deasync');
deasync(dosomething(i));
dosomethingelse(i);
相同的結果。此外,如果我拿出長期運行的dosomething
函數並將其替換爲sleep.sleep(3)
,我會得到相同的結果。節點只是從一個阻塞任務轉到下一個,而不更新UI。
我曾考慮過使用像這樣的命令行任務假脫機程序:http://vicerveza.homeunix.net/~viric/soft/ts/,通過它運行我所有沉重的CPU任務,然後每秒鐘輪詢一次更新我的進度條。這種方法的問題在於它不會跨平臺(至少有這個假脫機程序)。我將不得不通過Windows端口獲得更多創意。 – UltrasoundJelly
只是做異步和put'em在承諾隊列? – mash
嘗試更新用戶視爲電子應用程序一部分的Chrome DOM。 – UltrasoundJelly