2015-06-21 21 views
5

$location.path('new/path') gibi bir yol değişikliğini çalıştırırsam, bu yolun altındaki kodla ne olur? Anladığım gibi, bir yol değişikliği kodun geri kalanının çalışmasını durduramıyor, ama aslında ne oluyor? Kod bitecek ve sadece o zaman yol değişecek mi? Bu kod çok zaman alıcı ise (yavaş bir ağ bağlantısında bir sunucuya bir şey kaydetme), konum değişikliği benzer şekilde geç olacak mı? Yoksa paralel olarak şeyler olur mu?

cevap

2

Here's a small test, kodu çalıştırmayı bitirdikten sonra konumu değiştirir gibi görünüyor. Jsfiddle'daki konsola bir göz atın, her iki döngüyü de göreceksiniz, ama birbiri ardına. @SilverlightFox'un belirttiği gibi javascript'te paralel işlem yapılmadığını belirtiyor. code in HomeCtrl is changed bir zaman aşımı dahil etmek durumunda zaman aşımı programının akışı ve programları sonra AboutCtrl yürütür yürütmek için zaman aşımı kırar çünkü

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

, konum ilk değiştirir. döngü çalışır, sonra http isteği bittikten 'hakkında' yer değişiklikleri, a proper async request ile

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

o zaman aşımı ile aynıdır. Yani, yavaş bir bağlantıda veritabanlarını güncelleştirmek için bir ajax çağrısı, uygulamanın yolları değiştirmesini durdurmaz. O niyeti olsaydı

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

Çünkü bir ağ çağrısı rotasını değişiyordu, ben, başarı/hata vaadi veya geri aramasında yapardı.

+0

Herhangi bir paralel işlem olmayacaktır, çünkü JavaScript tek iş parçacıklı. Zaman uyumsuz isteklerde bulunabilirsiniz, ancak tetiklenen herhangi bir olay sıraya konur. – SilverlightFox

+0

@SilverlightFox Evet, siz haklısınız. Şeylerin düzeni hakkında daha çok düşünüyordum. Belki de "$ location" işlevi yeterince hızlıysa, işlevlerin geri kalanı yürütülmeden önce yolu güncelleyebilir. – Jorg

İlgili konular