从角度$ promise和服务的异步响应中苦苦挣扎

时间:2014-02-26 15:52:55

标签: javascript angularjs

我创建了一个角度服务,它基本上是另一个服务的包装器,它为json数据提供$ resource请求。这个'包装器服务'执行一些数据格式化,然后将结果返回给我的控制器。

我的问题是我正在努力从我创建的'wrapper'服务中的函数填充我的控制器中的$ scope变量(总是未定义)。我已尝试使用Deferred API,但是如果我在控制器中调用promise.then方法(没有格式化),我只能在控制器中成功获取数据,这会使目的失效。

如何将格式化列表返回给控制器?我写了一个Plunker,下面没有编译,但包含了我想要实现的目标。

http://plnkr.co/edit/AGyyqvawpnBmKXTcvGkJ?p=info

2 个答案:

答案 0 :(得分:1)

没有能够编译plunkr有点困难,但你能告诉我这是否有效:

factory.js:

routingRulesHelper.factory('ruleSetQueryWrapper', ['$q','RuleSets',

function($q, RuleSets) {
    var formatResults = function (ruleSet) {

        var aRuleSchedule = {};

        //format the payload to correct data ...........

        return aRuleSchedule;
    };
    return {
        getRuleSetById: function(ruleSetId){
            var deferred = $q.defer();
            var ruleset = RuleSets.query({ruleSetId: ruleSetId}, function(ruleSet) {
                deferred.resolve(formatResults(ruleSet));

            }, function(response) {
                //404 or bad
                if(response.status === 404) {
                    console.log("HTTP Error", response.status);
                }
                deferred.reject();
            });
            return deferred.promise;
        }
}}]);

controller.js:

routingRulesControllers.controller('RulesDisplayCtrl', ['$scope', '$location', '$routeParams', 'RuleSets', 'ruleSetQueryWrapper',
function($scope, $location, $routeParams, RuleSets, ruleSetQueryWrapper) {

    $scope.formattedResults = null;

    if($routeParams.ruleSetId) {
         ruleSetQueryWrapper.getRuleSetById($routeParams.ruleSetId).then(function(results) {
          $scope.formattedResults = results;
         });
    }
}]);

答案 1 :(得分:0)

我相信你应该代替这个

deferred.resolve(ruleSet)

DO

deferred.resolve(formatResults(ruleset))

您也没有在getRuleSetById服务方法中返回deferred.promise。