5
如果我執行類似$location.path('new/path')
的路徑更改,此路徑更改下的代碼會發生什麼變化?據我所知,路徑更改不會阻止其他代碼運行,但實際發生了什麼?代碼是否會完成,只有路徑會改變?因此,如果此代碼非常耗時(例如,在緩慢的網絡連接上將某些內容保存到服務器上),位置更改是否也會類似延遲?或者事情會同時發生?
如果我執行類似$location.path('new/path')
的路徑更改,此路徑更改下的代碼會發生什麼變化?據我所知,路徑更改不會阻止其他代碼運行,但實際發生了什麼?代碼是否會完成,只有路徑會改變?因此,如果此代碼非常耗時(例如,在緩慢的網絡連接上將某些內容保存到服務器上),位置更改是否也會類似延遲?或者事情會同時發生?
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++;
}
});
如果我改變,因爲網絡電話的路線,我會做的更迭/錯誤承諾或回調,如果是這樣的意圖。
因爲JavaScript是單線程的,所以不會有任何並行處理。您可以進行異步請求,但觸發的任何事件都會排隊。 – SilverlightFox
@SilverlightFox是的,你是對的。我正在考慮更多關於事物的順序。如果速度足夠快,'$ location'可能會在函數的其他部分執行之前更新路徑。 – Jorg