2015-06-21 5 views
5

यदि मैं $location.path('new/path') जैसे पथ परिवर्तन निष्पादित करता हूं, तो इस पथ के नीचे दिए गए कोड के साथ क्या होता है? जैसा कि मैं समझता हूं, पथ परिवर्तन शेष कोड को चलने से नहीं रोकता है, लेकिन वास्तव में क्या हो रहा है? क्या कोड खत्म हो जाएगा और केवल तभी पथ बदल जाएगा? तो यदि यह कोड बहुत समय ले रहा है (धीमे नेटवर्क कनेक्शन पर किसी सर्वर को कुछ सहेजना कहें), तो क्या स्थान परिवर्तन इसी तरह देर हो जाएगा? या चीजें समानांतर में घटित होंगी?

उत्तर

2

Here's a small test, ऐसा लगता है कि यह कोड चलाने के समाप्त होता है, फिर स्थान बदलता है। Jsfiddle में कंसोल पर एक नज़र डालें, आप दोनों लूप जा रहे हैं, लेकिन एक के बाद एक।

@SilverlightFox बताते हैं, जावास्क्रिप्ट में कोई समानांतर प्रसंस्करण नहीं है।

//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 कार्यान्वित निष्पादित करने के लिए टूट जाता है। स्थान परिवर्तन 'के बारे में' पाश रन, तो http अनुरोध खत्म:

//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 के साथ यह समय समाप्ति के रूप में ही है। इसलिए, एक धीमे कनेक्शन पर डेटाबेस अपडेट करने के लिए एक 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

कोई समांतर प्रसंस्करण नहीं होगी क्योंकि जावास्क्रिप्ट एकल थ्रेडेड है। आप एसिंक्रोनस अनुरोध कर सकते हैं, लेकिन ट्रिगर किए गए किसी भी ईवेंट को कतारबद्ध किया गया है। – SilverlightFox

+0

@ सिल्वरलाइटफॉक्स हां, आप सही हैं। मैं चीजों के आदेश के बारे में और सोच रहा था। शायद '$ location' शेष फ़ंक्शन निष्पादित होने से पहले पथ अपडेट कर सकता है, यदि यह पर्याप्त तेज़ है। – Jorg

संबंधित मुद्दे