2015-06-21 16 views
5

Jeśli wykonam zmianę ścieżki, taką jak $location.path('new/path'), co stanie się z kodem poniżej tej zmiany ścieżki? Jak rozumiem, zmiana ścieżki nie powstrzymuje reszty kodu przed uruchomieniem, ale co się właściwie dzieje? Czy kod się skończy i dopiero wtedy zmieni się ścieżka? Więc jeśli ten kod jest bardzo czasochłonny (np. Zapisywanie czegoś na serwerze w powolnym połączeniu sieciowym), czy zmiana lokalizacji będzie podobnie opóźniona? Czy rzeczy dzieją się równolegle?

Odpowiedz

2

Here's a small test, wygląda na to, że kończy działanie kodu, a następnie zmienia lokalizację. Spójrz na konsolę w jsfiddle, zobaczysz obie pętle, ale jedna po drugiej.

Jak zauważa @SilverlightFox, nie ma przetwarzania równoległego w 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++ 
    } 
} 

Jeśli code in HomeCtrl is changed zawierać timeout, położenie zmienia pierwsze dlatego limit czasu przerywa przepływ programu i harmonogramy limit czasu na wykonanie po z AboutCtrl wykonany.

//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) 
} 

Z proper async request jest taka sama jak timeout: zmiany lokalizacji, „O mnie” przebiegów pętli, a następnie zakończy żądania HTTP. Tak więc wywołanie ajax, aby zaktualizować bazy danych przy wolnym połączeniu, nie powstrzymuje aplikacji przed zmianą tras.

//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++; 
     }   
    }); 

Gdybym była zmiana trasy powodu połączenia sieciowego, zrobiłbym to w sukces/obietnicy błędu lub zwrotnego, czy to było zamierzone.

+0

Nie będzie żadnego przetwarzania równoległego, ponieważ JavaScript jest pojedynczy wątek. Możesz wysyłać asynchroniczne żądania, ale każde zdarzenie wyzwalane jest w kolejce. – SilverlightFox

+0

@SilverlightFox Tak, masz rację. Myślałem o porządku rzeczy. Może '$ location' może zaktualizować ścieżkę przed wykonaniem pozostałych funkcji, jeśli jest wystarczająco szybki. – Jorg

Powiązane problemy