2015-06-21 61 views
5

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

回答

2

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是一样的超时:位置的变化,“关于”循环运​​行,那么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++; 
     }   
    }); 

如果我改变,因为网络电话的路线,我会做的更迭/错误承诺或回调,如果是这样的意图。

+0

因为JavaScript是单线程的,所以不会有任何并行处理。您可以进行异步请求,但触发的任何事件都会排队。 – SilverlightFox

+0

@SilverlightFox是的,你是对的。我正在考虑更多关于事物的顺序。如果速度足够快,'$ location'可能会在函数的其他部分执行之前更新路径。 – Jorg

相关问题