2016-04-10 106 views
0

我不熟悉JavaScript承諾功能。Javascript承諾在角度控制器

目前,我有我的角度控制這個代碼

$http.get('pages/about.html').then(function(response) { 
    var raw_html = response.data; 
    $scope.aboutHTML = raw_html.replace(/</g,"&lt;"); 
}); 

我想重新寫代碼,所以我可以做這樣的事情

$scope.indexHTML = getHTML('pages/index.html'); 
$scope.aboutHTML = getHTML('pages/about.html'); 
... 

與功能類似這樣的

function getHTML(url){ 
    $http.get(url).then(function(response) { 
     var raw_html = response.data; 
     return = raw_html.replace(/</g,"&lt;"); 
    }); 
} 

如何正確地爲上面的函數編寫代碼?

[更新#1]

通過@charlietfl

function getHTML(url){ 
    // return the promise 
    return $http.get(url).then(function(response) { 
     var raw_html = response.data.replace(/</g,"&lt;"); 
     return raw_html; 
    }); 
} 

getHTML('pages/index.html').then(function(raw_html){ 
    $scope.indexHTML = raw_html; 
}); 

我想要寫此功能,以減少手工作業,用這種方法我還需要寫下$範圍治標不治本。 {page}爲每個頁面,所以任何人都知道更好的方式?

[更新#2]

解決方案通過@joeytwiddle

function getHTML(url){ 
    // return the promise 
    return $http.get(url).then(function(response) { 
     var raw_html = response.data.replace(/</g,"&lt;"); 
     return raw_html; 
    }); 
} 

getHTML('pages/index.html').then(function(raw_html){ 
    $scope.indexHTML = raw_html; 
}); 
+0

如果你正在使用* angular ui router *,那麼使用'resolve'就有一個* clean *的方法來達到這個目的。如果您使用的是ui路由器,請查看:http://bguiz.github.io/js-standards/angularjs/resolving-promises-for-a-controller/ –

回答

1

沒有辦法只是返回結果,因爲結果將不可用,直到將來的某個時間。 #asynchronous

您只能使用回調函數處理結果。

如果你希望儘量減少來自外部的工作,我建議是這樣的:

getHTMLAndStore('pages/index.html', $scope, 'indexHTML'); 
getHTMLAndStore('pages/about.html', $scope, 'aboutHTML'); 

function getHTMLAndStore(url, object, property) { 
    $http.get(url).then(function(response) { 
     var raw_html = response.data; 
     var weird_html = raw_html.replace(/</g,"&lt;"); 
     object[property] = weird_html; 
    }).catch(console.error.apply(console)); 
} 

這是純JS並沒有真正涉及到角。

請注意,這兩個請求將並行觸發,而不是按順序觸發。

1

$http返回一個承諾,所以你需要返回從功能的諾言,並使用其它then()的範圍變量分配:

function getHTML(url){ 
    // return the promise 
    return $http.get(url).then(function(response) { 
     var raw_html = response.data.replace(/</g,"&lt;"); 
     return raw_html; 
    }); 
} 

getHTML('pages/index.html').then(function(raw_html){ 
    $scope.indexHTML = raw_html; 
}); 

當前你的功能不返回任何東西

+1

否...您無法返回異步來自函數的數據響應 – charlietfl