如果代码低于$ location.path(' new / path'),会发生什么?

时间:2015-06-21 21:56:12

标签: angularjs

如果我执行类似$location.path('new/path')的路径更改,此路径更改下面的代码会发生什么变化?据我所知,路径更改不会阻止其余代码运行,但实际发生了什么?代码是否会完成,然后路径才会改变?因此,如果此代码非常耗时(比如在慢速网络连接上将某些内容保存到服务器上),位置更改是否会同样延迟?或者事情会同时发生吗?

1 个答案:

答案 0 :(得分:3)

Here's a small test,看起来它完成了运行代码,然后更改了位置。看看jsfiddle中的控制台,你会看到两个循环,但一个接一个。

正如@SilverlightFox指出的那样,javascript中没有并行处理。

//this one loads first, executes the loop, then changes location. 
function HomeCtrl($scope, $location) {
    $location.path('/about');
    var i  = 0;
    while(i < 1000000000) {
        if(i % 100000000 === 0) {
            console.log('home')   
        }
       i++;
    }
}

//this loop executes second. 
function AboutCtrl($scope) {
    $scope.name = 'John';
     var i  = 0;
    while(i < 1000000000) {
        if(i % 100000000 === 0) {
            console.log('about')   
        }
        i++
    }
}

如果code in HomeCtrl is changed包含超时,则位置会先更改,因为超时会中断程序流并调度执行 AboutCtrl后执行的超时时间。

//changes location first, executes AboutCtrl, then does the "home" loop
function HomeCtrl($scope, $location) {
    $location.path('/about');
    setTimeout(function() {
        var i  = 0;
        while(i < 1000000000) {
            if(i % 100000000 === 0) {
                console.log('home')   
            }
           i++;
        }        
    }, 1)
}

proper async request与超时相同:位置更改,&#39;关于&#39;循环运行,然后http请求完成。因此,在慢速连接上更新数据库的ajax调用不会阻止应用程序更改路由。

//changes location, executes 'AboutCtrl', then finishes the http request and 
//executes the 'home' loop.
function HomeCtrl($scope, $location, $http) {
    $location.path('/about');
    $http.get('/echo/json/').success(function() {
        var i  = 0;
        while(i < 1000000000) {
            if(i % 100000000 === 0) {
                console.log('home')   
            }
           i++;
        }        
    });

如果我因网络电话而改变路线,我会在成功/错误承诺或回调中进行,如果这是意图。