Javascript 一次打印一个输出而不是一次打印整个页面?

标签 javascript performance

只是玩了一下,但注意到加载页面的时间太长了,有没有办法让它一次打印一行而不是等到整个页面加载完毕。

limits(){
    var a = 0;

    for (var i = 0; i < 1000; i++) {
        for (var ii = 0; ii < 1000; ii++) {
            document.getElementById('foo').innerHTML += "<p>" + a + "</p>";
            a * 2;

        }
    }
}

现在我如何能够更好地控制它到哪里,无论它需要多长时间才能在准备就绪后立即加载打印,甚至放慢速度也可以。

最佳答案

javascript 方法 window.requestAnimationFrame(callback) 将在下一个动画帧调用您的回调函数。它通常用于动画,并且可能会很好地用于您正在做的事情。

要修改您的代码以使用requestAnimationFrame,您必须让您的函数自行打印一小块,并提供一个引用以了解要打印的 block 。例如,如果您将页面内容存储在一个数组中,那么它可能只是一个起始索引和一个长度。由于您打印的是 2 的递增幂,因此您只需传入 2 的最后一次幂以及函数每次运行要打印的行数。

您还需要一个退出条件——在 limits 内进行检查,如果为真,则返回而不请求下一帧。我只是对 a 的值设置了硬性上限,但您也可以检查索引是否小于数组长度(对于我上面的页面内容数组想法)。

因为 requestAnimationFrame 传入一个函数名作为回调,所以您不能将参数传递给它。因此,您必须使用 bind 将值附加到函数中。然后,在函数内,您可以使用 this 访问它们。 config 只是一个对象,用于保存您希望函数拥有的初始参数,然后绑定(bind)它,这允许您在函数内使用 this.numLines 访问它们和 this.a

然后,当您请求下一帧时,您必须再次将值绑定(bind)到 limits。如果您不介意保持参数不变,则可以执行 limits.bind(this)。但是如果你想改变它们,你可以用类似于我编写 config 的方式创建另一个对象并绑定(bind)它。

以下代码似乎是您大致要查找的内容的基本示例:

var foo = document.getElementById('foo');
var maxA = 1000000000000000000000000000000000;
function limits() {
    for(var i=0; i<this.numLines; ++i) {
        foo.innerHTML += "<p>" + this.a + "</p>";
        this.a *= 2;
        if(this.a > maxA) {
            return;
        }
    }
    requestAnimationFrame(limits.bind(this));
}

config = {
    numLines: 3,
    a: 1
};
requestAnimationFrame(limits.bind(config));

并在 JSFiddle 中实现 here .我还实现了一个版本,它将每一行都放在页面的顶部(而不是将其附加到底部),这样您就可以更好地看到它的发生(您可以找到那个 here )。

关于Javascript 一次打印一个输出而不是一次打印整个页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50453899/

相关文章:

javascript - GET 请求出现 401 Unauthorized Error,是否是 CORS 问题

javascript - 在 d3 中使用箭头函数

javascript - 花式框 3 JQuery : Close gallery when click outside element

MySQL : combining multiple integer fields into one string field?

performance - 将大量带有 Guid ID 的对象传输到客户端

javascript - 从文件上传列表中删除选定的文件

javascript - 如何在 Google 跟踪代码管理器中将数据层变量从数字转换为字符串

c# - 减少 regex/linq 的 2 GB 内存占用或解决获取不同组值的问题

Android - 在 View 中高效更新计数器

c# - Object.GetType() 的性能