从函数返回没有分配给$ scope?

时间:2015-01-05 12:06:38

标签: javascript angularjs

这是我的控制器:

$scope.mainModel = getReviews({model:mainModelArr[1]});
$scope.compareModel = getReviews({model:compareModelArr[1]});

function getReviews(data) {
    $http.post(url, data)
    .success(function(res) {
        formatReviews(res)
    })
    .error(function(err) {
        console.log("Something went wrong: "+err);
    });
}

function formatReviews(data) {
    var review = data[0];
    review.sumReviews = (review.sumReviews/review.ratingAvg).toFixed(0);
    review.sumRecommend = (review.sumRecommend/review.sumReviews*100).toFixed(1);
    review.ratingAvg = (review.ratingAvg).toFixed(1);
    console.log(review); // logs message fine 
    return review;
}

这些功能运行正常,日志 review var。但不知何故,它既没有将review变量分配给$scope.mainModel也不分配给{{} 1}}。

注意:我知道它没有被分配,因为它从未出现在HTML中:

$scope.compareModel

我做错了什么以及如何解决?

2 个答案:

答案 0 :(得分:1)

由于异步代码不允许您只返回值,因此您应该使用then方法处理promises:

getReviews({model: mainModelArr[1]}).then(function(data) {
    $scope.mainModel = data;
});

getReviews({model: compareModelArr[1]}).then(function(data) {
    $scope.compareModel = data;
});

function getReviews(data) {
    return $http.post(url, data)
    .success(formatReviews)
    .error(function(err) {
        console.log("Something went wrong: "+err);
    });
}

答案 1 :(得分:1)

Ajax请求工作异步,angularjs使用promises来处理此请求

$scope.mainModel = undefined;
$scope.compareModel = undefined;

getReviews({model:mainModelArr[1]}).success(function(res){
    $scope.mainModel = formatReviews(res);
});

getReviews({model:compareModelArr[1]}).success(function(res){
    $scope.compareModel = formatReviews(res);
});

如果您return发布了请求,则可以随时随地处理,getReviews方法

function getReviews(data) {
    return $http.post(url, data)
    .error(function(err) {
        console.log("Something went wrong:", err);
    });
}

function formatReviews(data) {
    var review = data[0];
    review.sumReviews = (review.sumReviews / review.ratingAvg).toFixed(0);
    review.sumRecommend = (review.sumRecommend / review.sumReviews * 100).toFixed(1);
    review.ratingAvg = (review.ratingAvg).toFixed(1);   
    console.log(review); // logs message fine 
    return review;
}