如何从基于jhipster的应用程序中的Promise对象获取当前登录的用户详细信息

时间:2016-02-06 02:46:09

标签: javascript angularjs jhipster

我正在尝试在前端创建“Order”对象并使用REST服务将其推送到数据库中。 'Order'的POJO如下所示

@NotNull
@Field("total")
private BigDecimal total;

@Field("status")
private String status;

@Embedded
public User user;

现在我有一个'Principal'服务,它提供当前登录用户的信息。我尝试了'console.log(Principal.identity())'返回结果,如下所示。这里'用户'数据存在于'$$ state'对象中 enter image description here  我无法找到如何从promise对象获取'user'数据并添加到'Order'对象。我有一个脏方法来通过挖掘Promise对象来获取用户数据,如下所示,但我对这个方法持怀疑态度。 enter image description here

在这种情况下从Promise获取数据的正确方法是什么?

编辑: 这是基于jhipster的应用程序。以下是“原则”服务代码

            'identity: function (force) {
            var deferred = $q.defer();

            if (force === true) {
                _identity = undefined;
            }

            // check and see if we have retrieved the identity data from the server.
            // if we have, reuse it by immediately resolving
            if (angular.isDefined(_identity)) {
                deferred.resolve(_identity);

                return deferred.promise;
            }

            // retrieve the identity data from the server, update the identity object, and then resolve.
            Account.get().$promise
                .then(function (account) {
                    _identity = account.data;
                    _authenticated = true;
                    deferred.resolve(_identity);
                    Tracker.connect();
                })
                .catch(function() {
                    _identity = null;
                    _authenticated = false;
                    deferred.resolve(_identity);
                });
            return deferred.promise;
        }'

以下是使用ngResource从服务器接收资源的jhipster生成方法。

'angular.module('hotSpiceApp')
.factory('Order', function ($resource, DateUtils) {
    return $resource('api/orders/:id', {}, {
        'query': { method: 'GET', isArray: true},
        'get': {
            method: 'GET',
            transformResponse: function (data) {
                data = angular.fromJson(data);
                return data;
            }
        },
        'update': { method:'PUT' }
    });
});'

2 个答案:

答案 0 :(得分:3)

Queue<String> newQueue函数返回一个Promise。首先阅读promise

然后执行以下操作:

Principal.identity()

Principal.identity().then(function (user) { var data = { // other fields user: user }; // do something with data only inside this inner function }); 是不好的,不仅因为它与角度承诺的内部实现相关,而且在所有情况下都不起作用。本质上的Prom是异步的,这只是因为Jhipster缓存了返回当前用户的http请求的结果。但是如果在您的新请求时没有关于当前用户的信息,那么Principal.identity().$$state.value将是Principal.identity().$$state.value,因为首先它需要向服务器发送http请求,并且只有在此之后该承诺才会被“解析” “(在内部,它将设置undefined变量和value方法中定义的调用函数。”

另外我应该注意,您不应该将当前用户从JS代码传递到服务器。在请求到达后,您应该在服务器端(从会话或某事物)获取当前用户,并在需要时将其设置为您的模型。永远不要相信用户代码(在用户浏览器中运行的代码)。它可以为此请求注入任何值并将其发送到服务器。

答案 1 :(得分:0)

您能解释一下检索主要服务的方式吗?如果它返回一个promise,你需要在“then”方法中将你想要的数据设置为局部变量。

现在要查看“Principal”服务有哪些内容,您可以在chrome console中使用以下代码

angular.element(document.querySelector('html')).injector().get(Principal);