【问题标题】:Struggling with angular $promise and asynchronous response from service挣扎于角度 $promise 和来自服务的异步响应
【发布时间】:2014-02-27 00:21:50
【问题描述】:

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

我的问题是我正在努力从我创建的“包​​装器”服务中的函数填充我的控制器中的 $scope 变量(始终未定义)。我对 Deferred API 进行了一些尝试,但是如果我在控制器中调用 promise.then 方法(不格式化),我只能成功地在控制器中获取我的数据,这违背了目的。

如何将格式化列表返回到我的控制器?我在下面写了一个 Plunker,它不会编译但包含我想要实现的要点。

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

【问题讨论】:

  • 如果 plunker 无法正常工作,我们如何判断是您的代码中存在问题还是只是在 plunker 中存在问题?
  • 您尝试过服务而不是使用因素吗?从:routingRulesServices.factory('RuleSets' 到:routingRulesServices.service('RuleSets'
  • 嗨 Anthony Chu,我知道使用无法编译的代码示例很难,但我认为我的问题是根本缺乏理解,所以我确信有人可以提供帮助,这Wawy 能够:)

标签: javascript angularjs


【解决方案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;
         });
    }
}]);

【讨论】:

  • 我同意这一点,user1027339 正在尝试解决他的服务中的承诺,他应该返回承诺并在控制器中解决它,如图所示
  • 你是个传奇。谢谢你。结果一看就很明显,但是当涉及到异步数据和延迟/承诺 API 时,我需要提高自己的理解水平。
【解决方案2】:

我相信你应该代替这个

deferred.resolve(ruleSet)

deferred.resolve(formatResults(ruleset))

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

【讨论】:

  • 感谢您的想法。这也是正确的,但我只是错过了控制器中的一些逻辑,Wawy 的回答帮助了我
猜你喜欢
  • 2020-02-02
  • 2019-01-12
  • 2012-01-06
  • 1970-01-01
  • 2023-04-06
  • 2014-08-30
  • 1970-01-01
  • 1970-01-01
  • 2019-02-08
相关资源
最近更新 更多