location.href的异步机制

4,811 阅读1分钟

最近在项目中遇到一个问题,微信环境下获取openid会刷新页面,因为项目及其古老,所以里面使用了location.href来跳转新页面。

然而这里就导致了一个bug,实际场景为某些接口在刷新页面前后分别加载了一次,造成了不必要的性能耗损,以及更为致命的是某页面为问卷调查,此页面对于访问等等做了相关限制,页面在加载时访问两次就会导致严重的问题。

在进行bug定位的时候发现了location.href跳转并没有立即执行,查阅相关资料后了解了其运行机制。

location.href

window.location.href的赋值,并不会中断Javascript的执行立即进行页面跳转。

因为 LocationChange 行为在浏览器内核中是起定时器异步执行的。

异步执行的好处是为了防止代码调用过深,导致栈溢出,另外也是为了防止递归进入加载逻辑,导致状态紊乱,保证导航请求是顺序执行的。

代码实例

(function(){
    window.location.href= 'http://www.baidu.com';
    console.log(123);
}())

上述代码不会立即执行页面跳转,而是会先输出123,然后才会跳转到baidu页面

解决方法

(function(){
    window.location.href= 'http://www.baidu.com';
    return 
    console.log(123);
}())

解决方法也很简单,在后面加上return即可

上古神兽镇楼