Angular控制器上的Javascript承诺

时间:2016-04-10 10:48:34

标签: javascript angularjs

我不熟悉JavaScript Promises功能。

目前我在Angular Controller上有这个代码

$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;
});

我想编写这个函数来减少手动工作,这样我仍然需要为每个页面写下$ scope。{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;
});

2 个答案:

答案 0 :(得分:1)

then()返回一个promise,因此您需要从函数返回该promise并使用另一个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; }); 来分配范围变量:

arrowbutton.setOnClickListener()

目前您的功能不会返回任何内容

答案 1 :(得分: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,与Angular无关。

请注意,这两个请求将并行触发,而不是按顺序触发。