我正在尝试在前端创建“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'对象中 我无法找到如何从promise对象获取'user'数据并添加到'Order'对象。我有一个脏方法来通过挖掘Promise对象来获取用户数据,如下所示,但我对这个方法持怀疑态度。
在这种情况下从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' }
});
});'
答案 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);