如果您主要关心的不是在您开发的冗长的 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});
});
})();
请注意,这是一个非常简化的功能,可以对其进行改进以处理其他与多线程相关的问题——即:等待线程完成(加入)。我希望这段代码可以帮助你。如果您喜欢这种解决问题的方法,请告诉我,如果您愿意,我可以花一些时间改进我的建议。