Angularjs 返回defer.promise未按预期工作

Angularjs 返回defer.promise未按预期工作,angularjs,Angularjs,我已经开始做了三天的Angular了,我不能把我的头放在承诺的概念上 我试图创建一个工厂,在两个控制器之间共享JSON数据。这些数据表示一个序列化的SQL数据表 工厂使用$http获取数据 var app = angular.module('myApp', ['ngAnimate', 'ngSanitize', 'ui.bootstrap']); app.factory('Tableau', function ($http, $q) { var obj = {}; obj.ge

我已经开始做了三天的Angular了,我不能把我的头放在承诺的概念上

我试图创建一个工厂,在两个控制器之间共享JSON数据。这些数据表示一个序列化的SQL数据表

工厂使用$http获取数据

var app = angular.module('myApp', ['ngAnimate', 'ngSanitize', 'ui.bootstrap']);

app.factory('Tableau', function ($http, $q) {
    var obj = {};
    obj.getTable = function (page) {
            var temp = {};
            var defer = $q.defer();
            $http.get('api/Table/' + page).then(function (resolve) {
                defer.resolve(resolve.data);
            });
            return defer.promise;
    }
    return obj;
});
第一个控制器应将数据显示为HTML表

app.controller("TableController", function ($scope, Tableau) {
    $scope.elements = Tableau.getTable(2); // get the first ten rows with row id >= n x 10 (in this case 2 x 10)
});
这是带有ng指令的HTML代码

<tr ng-repeat="t in elements.myarray track by $index">
    <td ng-repeat="(k,v) in t track by $index">
        <div ng-if="k.indexOf('#')===0">
            <span class="label label-default" ng-repeat="vv in v.split(';')">{{vv}}</span><br />
        </div>
        <div ng-if="k.indexOf('§')===0">
            <a href="{{v}}">Lien</a>
        </div>
        <div ng-if="k.indexOf('#')!=0 && k.indexOf('§')!=0">
            {{v}}
        </div>
    </td>
</tr>

{{vv}}
{{v}
我从控制器调用$http没有问题,但是当我将代码移动到工厂时,$scope.elements包含一个promise对象,而不是预期的JSON对象

我没有实现第二个控制器,它将为表创建分页(使用)

  • 在从工厂返回对象之前,如何等待$http完成

  • 如果这不可能,我如何在一次移动中共享从服务器检索到的数据


  • 提前感谢。

    您需要等待承诺完成后才能使用其结果。这意味着使用
    。然后()

    您还沦为显式承诺构造反模式的牺牲品

    为您的工厂简化实施:

    app.factory('Tableau', function ($http, $q) {
        var obj = {};
    
        obj.getTable = function (page) {
            return $http.get('api/Table/' + page)
                .then(function (result) {
                    return result.data;
                });
        };
    
        return obj;
    });
    

    在使用其结果之前,您需要等待承诺完成。这意味着使用
    。然后()

    您还沦为显式承诺构造反模式的牺牲品

    为您的工厂简化实施:

    app.factory('Tableau', function ($http, $q) {
        var obj = {};
    
        obj.getTable = function (page) {
            return $http.get('api/Table/' + page)
                .then(function (result) {
                    return result.data;
                });
        };
    
        return obj;
    });
    

    在控制器中:

       Tableau.getTable(2)
          .then((data) => {
           $scope.elements = data
        })
    

    在控制器中:

       Tableau.getTable(2)
          .then((data) => {
           $scope.elements = data
        })
    

    非常感谢,成功了。不过,我将JLRishe的答案标记为已接受的答案,以获得关于显式承诺构造反模式的额外提示。非常感谢,它成功了。不过,我将JLRishe的答案标记为已接受的答案,以获得关于显式承诺构造反模式的额外提示。非常感谢,特别感谢我不知道的反模式。非常感谢,特别感谢我不知道的反模式。