AngularJS在Jolokia请求中延迟承诺

AngularJS在Jolokia请求中延迟承诺,angularjs,hawtio,jolokia,Angularjs,Hawtio,Jolokia,我有一个应用程序作为Hawtio环境中的插件。要求使用Jolokia请求,而不是使用直接$http服务调用 因此,我有一个具有检索功能的工厂/服务 app.factory('myService', function($q, jolokia) { data: { list: [] }, retrieve: function() { var self = this; // var deferred = $q.deferred

我有一个应用程序作为Hawtio环境中的插件。要求使用Jolokia请求,而不是使用直接
$http
服务调用

因此,我有一个具有检索功能的工厂/服务

app.factory('myService', function($q, jolokia) {
    data: {
        list: []
    },
    retrieve: function() {

        var self = this;

        // var deferred = $q.deferred();

        jolokia.request({
            type: 'exec',
            mbean: mybean.mbean,
            operation: 'ops',
            arguments: [...]
        }, {
            method: 'POST',
            success: function(response) {
                var temp = [];

                /* assign values to temp from response */
                self.assignValuesToList(temp);

                /* log shows data.list is loaded by values */
                log("[service] " + self.data.list); // Hawtio uses a different logger

                // deferred.resolve();
            }   
        }, {
            error: function(error) {
                // error handling here

               // deferred.reject(error);   
            }
        });

        // return deferred.promise;
    }
});
这是我的控制器(该服务正在被其他控制器重用,这就是为什么我必须重新分配
myService.data.list
eventhough
myController
的作用域已经对其进行了控制):

和html:

<div ng-controller='myController' ng-init='init()'>

    <table>
        <thead>...</thead>
        <tbody>
            <tr ng-repeat='entry in ctrl.copyOfList'>
            ...
            </tr>
    </table>

</div>
桌子是空的

由于手头存在异步问题,我尝试使用promise(只是取消注释上面服务的延迟行)。我的控制器变成

app.controller('myController', function($scope, myService) {

    $scope.ctrl.copyOfList = [];

    angular.extend($scope, myService);

    $scope.init = function() {
        $scope.search();
        log("[after search] " + $scope.ctrl.copyOfList);
    };

    $scope.search = function {
        $scope.retrieve().
        then(function() {

            $scope.ctrl.copyOfList = $scope.data.list;
            log("[controller] " + $scope.ctrl.copyOfList);

            $scope.$apply();

        }, function(error) {
            // error handling here
        });

        log("[after promise] " + $scope.ctrl.copyOfList);
    };
});
现在我的日志看起来像:

[after promise] []
[after search] []
[service] [...]

// [controller] [...] log does not execute
桌子还是空的。这里更令人困惑的是,在我离开使用
myController
的页面之前,
[controller][…]
日志将在控制台上打印,并写入
$scope.ctrl.copyOfList
的内容,并立即填充表,然后突然更改页面

(我还尝试使用
deferred.resolve(self.data.list)
而不是
deferred.resolve()
,包括对控制器进行必要的更改,但这并不重要,尽管结果相同)

所以这里的任何人都可以知道发生了什么,这里的解决方案可能是什么?
谢谢。

在jolokia成功/错误回调中,您需要一个$scope.$apply()来触发angular的事件循环。在这样的服务中,我通常注入$rootScope并使用Core。$apply($rootScope)

您的解决方案有效。顺便问一下,
Core.$apply($scope)
(或
$rootScope
)和
$scope.$apply
)之间有什么区别?我也不明白
核心是从哪里来的,或者它是什么?
Core
是jolokia本地人吗?
app.controller('myController', function($scope, myService) {

    $scope.ctrl.copyOfList = [];

    angular.extend($scope, myService);

    $scope.init = function() {
        $scope.search();
        log("[after search] " + $scope.ctrl.copyOfList);
    };

    $scope.search = function {
        $scope.retrieve().
        then(function() {

            $scope.ctrl.copyOfList = $scope.data.list;
            log("[controller] " + $scope.ctrl.copyOfList);

            $scope.$apply();

        }, function(error) {
            // error handling here
        });

        log("[after promise] " + $scope.ctrl.copyOfList);
    };
});
[after promise] []
[after search] []
[service] [...]

// [controller] [...] log does not execute