1.tiles有时会放置一个数组,目的是什么?
tiles: [
'http://t0.tianditu.com/DataServer?T=img_w&x={x}&y={y}&l={z}',
'http://t1.tianditu.com/DataServer?T=img_w&x={x}&y={y}&l={z}',
'http://t2.tianditu.com/DataServer?T=img_w&x={x}&y={y}&l={z}',
'http://t3.tianditu.com/DataServer?T=img_w&x={x}&y={y}&l={z}'
],
将多个瓦片地址模板放在 tiles 数组中的目的是为了增加地图数据的可用性和可靠性。每个瓦片地址模板都对应着一个瓦片服务器,地图引擎在加载瓦片数据时会尝试从这些不同的服务器获取数据。这样做的好处有几个:
分布式加载: 通过使用多个瓦片服务器,地图引擎可以同时从多个服务器加载数据,从而加快地图的加载速度。这对于保证用户在不同地区的流畅体验非常重要,因为不同地区可能有不同的网络延迟。
冗余备份: 当一个瓦片服务器出现故障或不可用时,地图引擎可以尝试从其他可用的服务器获取数据。这提高了地图数据的可用性和稳定性,减少了单点故障的风险。
负载均衡: 使用多个瓦片服务器可以将用户的请求分散到不同的服务器上,从而实现负载均衡,减轻单个服务器的压力。
防止限流和过载: 一些地图服务提供商可能会对每个服务器的请求进行限流,通过使用多个瓦片服务器,可以减少单个服务器的请求量,从而避免触发限流和过载。
综上所述,将多个瓦片地址模板放在 tiles 数组中可以提高地图加载的效率、稳定性和可靠性,确保用户在不同地区和不同网络条件下都能获得良好的地图体验。
2.js中同步异步执行顺序(事件循环)
<script>
console.log("Start");
setTimeout(() => {
console.log("Timeout");
}, 3000);
// 获取循环开始时间戳
const startTime = performance.now();
// 模拟耗时的同步操作
for (let i = 0; i < 1000000; i++) {
// some computation
console.log(i);
}
// 获取循环结束时间戳
const endTime = performance.now();
// 计算循环执行时间
const executionTime = (endTime - startTime) / 1000;
console.log(`Loop executed in ${executionTime} seconds`);
console.log("End");
</script>
JavaScript中的事件循环会等待当前的同步任务执行完毕,然后再去处理异步任务,无论是定时器还是其他类型的异步操作。所以,尽管定时器的回调函数在3秒后就准备好了,但只有在当前所有的同步任务都执行完毕后才会实际执行。
在这个例子中,尽管定时器的回调函数在3秒后准备好了,但由于后面的同步操作循环耗时很长,事件循环将等待循环完成后,才会执行定时器的回调函数。因此,即使定时器的时间已经到了,回调函数也会在同步操作完成后输出。
- 再次举例:
都是132