如果您的主要擔心是在您開發的漫長JavaScript處理過程中不凍結UI,則可以將循環體重構爲連續步驟,以便每個步驟使用window.setTimeout
調用其下一步。這種技術允許(單個)線程來處理每個交互之間的UI的事件:
var pr = function(x) {console.log(x)};
var COUNT=3;
// original regular javascript loop
for(var i=0; i<COUNT; i++) {
var msg = "current index is (" + i + ")";
pr(msg);
}
// step-by-step sequential calls
var body = function(i) {
var msg = "non-blocking for: index is (" + i + ")";
pr(msg);
}
nonBlockingFor(body, 4);
nonBlockingFor
調用的第一個參數(作爲函數)的倍第二參數傳遞的數目的函數。它的定義如下:
// function constructor
var nonBlockingFor = (function() {
function _run(context) {
if(context.idx > context.max) return;
context.fnc(context.idx++);
window.setTimeout((function(){ _run(context)}), 1);
}
return (function _start(ufn, uqt, runId) {
_run({idx: 0, max: uqt -1, fnc: ufn || (function(){}), runId: runId});
});
})();
請注意,這是一個非常簡單的功能,它可以提高處理等多線程相關的問題 - 即:等待線程完成(加入)。我希望這段代碼能幫助你。請讓我知道,如果您喜歡這種解決方法,如果您願意,我可以花一些時間改進我的建議。
我認爲重要的問題是您是否可以承受不凍結的應用程序。假設用戶在算法運行時對數據進行更改。在後臺運行的進程結果是否仍然有效/相關?如果沒有,最好向用戶顯示進度條並繼續進行計算。 – Qnan
數據重複有什麼問題?太多的東西序列化到工人? –
@SimoneGianni主要問題是UI上下文和工作環境之間的數據同步 –