我们需要每隔一段时间向浏览器释放控制权,以避免垄断浏览器的注意力。
释放控制权的一种方法是使用 a setTimeout
,它计划在某个时间段调用“回调”。例如:
var f1 = function() {
document.body.appendChild(document.createTextNode("Hello"));
setTimeout(f2, 1000);
};
var f2 = function() {
document.body.appendChild(document.createTextNode("World"));
};
调用f1
此处会将单词添加hello
到您的文档中,安排一个待处理的计算,然后将控制权释放给浏览器。最终,f2
将被调用。
请注意,setTimeout
像魔法小精灵一样不加选择地在整个程序中撒播是不够的:您确实需要在回调中封装其余的计算。通常,setTimeout
将是函数中的最后一件事,其余的计算都塞进回调中。
对于您的特定情况,需要仔细将代码转换为以下内容:
var heavyWork = function(i, onSuccess) {
if (i < 300) {
var restOfComputation = function() {
return heavyWork(i+1, onSuccess);
}
return doSomethingHeavy(i, restOfComputation);
} else {
onSuccess();
}
};
var restOfComputation = function(i, callback) {
// ... do some work, followed by:
setTimeout(callback, 0);
};
这将在每个restOfComputation
.
作为另一个具体示例,请参阅:如何将一系列声音 HTML5 <audio> 声音剪辑排队以按顺序播放?
高级 JavaScript 程序员需要知道如何进行这种程序转换,否则他们会遇到您遇到的问题。你会发现如果你使用这种技术,你将不得不以一种特殊的风格编写你的程序,其中每个可以释放控制的函数都接受一个回调函数。这种风格的技术术语是“持续传递风格”或“异步风格”。