如何修复长时间运行的脚本

How to fix long running scripts?

本文关键字:脚本 运行 长时间 何修复      更新时间:2023-09-26

我正在用一些数据构建传单地图。总的来说,在任何时间点,我都会在地图上有0到18000个标记点。

理解我试图实现的目标的必要代码:

var ds = L.markerClusterGroup({
                                disableClusteringAtZoom: 9,
                                maxClusterRadius: 120,
                                chunkedLoading: true,
                                iconCreateFunction: iconCreate
                            });
window.onload = function(){
    map = L.map('map', {
        layers: [baseLayer, ds],
        worldCopyJump: true,
        minZoom: 3,
        inertiaMaxSpeed: 300
    }).setView([lat, lng], zoom);
    callAjax("/ajax/markers1.php", markers); // 4220 rows
    // callAjax("/ajax/markers2.php", markers); // ~14000 rows
}
function callAjax(url, cb, options){
    var xhttp = new XMLHttpRequest(),
        opts  = options || {};

    xhttp.onreadystatechange = function(){
        ajaxCheck(xhttp, cb, opts);
    }
    xhttp.open("POST", url, true);
    xhttp.send();
}
function markers(xhttp){                    
    var dJson = JSON.parse(xhttp.responseText);
    for(var d = 0;d < dJson.length;d++){
        addMarker(dJson[d]);
    }
}
function addMarker(d){                
    L.marker([d.lat, d.lng], {
                id: d.id
            })
     .addTo(ds);
}

上面的代码从指定的URL获取一个JSON请求,并循环返回,将标记添加到已经绑定到映射的集群组中。在Chrome 49.0.2623.112 m中,需要8秒后返回第一个AJAX响应,再加载3到5秒才能加载所有标记。

在IE 11中,我得到了长的运行脚本。第一次标记运行中有4220条记录。我已经将循环限制为只能运行100次,而且它仍然需要长时间运行的脚本。使它只输出1个标记有效,但我需要全部4220个(以及后来的14000个)。

我发现了不同的地方发布了"长时间运行的脚本",但每个地方最终都会说"让你的代码变得更好"。对于我试图完成的任务,我的代码感觉是完美的。

我在控制IE以使此代码能够成功运行并最终在该地图上添加所有18000多个标记方面缺少什么?

有几个因素与这个问题有关。第一个问题是传单不是主要问题,而是(看似)不必要的代码的重复。

IE可以在决定失败之前运行大约500万行Javascript(未经编辑的设置)。这种逻辑的一个缺陷是,即使脚本之间有一段时间的等待,它似乎也能节省运行的行数。重置这个数字(严厉)的唯一方法是setTimeout。这完全是一种逃避。如果你必须这样做,不要气馁,但如果你有多次循环的脚本,并且需要它在IE中工作,那么你很可能需要添加一个setTimeout。

我确实找到了超时时间的建议,但50ms似乎还可以。其他建议是不要将其设置为浏览器中的默认时间就足够了。然而,一些浏览器将其设置为400ms,这将近半秒长。。。这对我来说似乎不合理。所以是50毫秒。到目前为止没有问题。

我想"让你的代码变得更好"才是真正的可能。或者只是摆脱IE。只是说说而已。

使用web浏览器中的分析工具来查看一直在吃什么。

在您的情况下,我敢打赌会在dblclick上调用addEventListener,换句话说,就是传单错误3972和传单错误4357,简短的答案是"从传单0.7.x升级到传单1.0.0-beta"。