Javascript 仅从异步调用中获取对象
我的目标是 显示需要在网页上操作的用户名。MNA操作应该在服务(MasterDataService)中集中完成。我想在屏幕上使用在控制器中定义的范围变量。控制器正在调用集中式服务。该服务正在调用另一个服务,该服务正在调用后端,处理用户名并将结果返回给控制器。结果应该是JSON对象,而不是已解析的请求(延迟和承诺) 网页->页面控制器->集中服务->用户服务->以及返回的方式 我就是这样做的 网页Javascript 仅从异步调用中获取对象,javascript,angularjs,angularjs-service,angularjs-controller,Javascript,Angularjs,Angularjs Service,Angularjs Controller,我的目标是 显示需要在网页上操作的用户名。MNA操作应该在服务(MasterDataService)中集中完成。我想在屏幕上使用在控制器中定义的范围变量。控制器正在调用集中式服务。该服务正在调用另一个服务,该服务正在调用后端,处理用户名并将结果返回给控制器。结果应该是JSON对象,而不是已解析的请求(延迟和承诺) 网页->页面控制器->集中服务->用户服务->以及返回的方式 我就是这样做的 网页 <div id="usercontainer" ng-show="currentUser" c
<div id="usercontainer" ng-show="currentUser" class="ng-hide">
Hallo, {{currentUser.currentUserName}}.<br />
(<a href="#/logout">Abmelden</a>)
</div>
用户服务
getCurrentUser: function (optionsData) {
$log.debug("UserService.getCurrentUser.start");
var promise = $http({
method: 'GET',
url: '/api/User'
}).then(function (response) {
var deferred = $q.defer();
$log.debug("UserService.changeOptions.success.status: " + response.status);
if (response.status == 200) {
deferred.resolve(response);
return deferred.promise;
}
deferred.reject('OptionsNotChanged');
return deferred.promise;
}, function (response) {
$log.debug("UserService.changeOptions.error.status: " + response.status);
return $q.reject('OptionsNotChanged');
});
return promise;
},
有人能告诉我为什么控制器中的对象之后是空的,以及我如何实现从MasterDataService获取被操纵的对象?
我是不是也要信守诺言和推迟呢?如果是这样,在返回服务中的用户对象之前,我如何操作它
提前谢谢
Sascha听起来像是你想要这样的东西:(本质上是$resource) 这是一本书。(我使用
$timeout
来模拟$http
)关键是维护对当前用户的一个引用
这就是为什么MasterService.getCurrentUser()代码>实际更新用户。所有这些都是var currentUser={}
。这个引用永远不会被删除。因此$scope.user==currentUser
理想情况下,您不希望在数据检索服务或控制器中执行业务逻辑。但是你的模型。要定义模型,您可以执行以下操作
angular.factory('User',function(){
var User = function(initWith){
initWith = initWith || {};
this.firstName = initWith.firstName || ''
this.lastName = initWith.lastName || ''
this.position = 'employee'
this.lastRetrieved = new Date();
}
User.prototype.doBusinessLogic = function(position){
this.position = position;
}
return User;
});
这是一个分叉。从异步操作返回值没有意义。您必须使用回调或承诺(实际上是同一事物的两个版本)。谢谢@Pointy。问题是,在以异步方式再次将返回的数据传递给调用方之前,我不知道如何在回调中操作返回的数据。谢谢!好的,让我看看我是否做对了。对后端进行调用的UserService返回被操纵的对象。中间的服务有一个引用变量,该变量由回调方法使用angular.extend()填充,并将操作对象作为函数参数获取。控制器必须使用$PROMITE并在回调函数中再次获取被操纵的对象。我不明白的是,通过调用MasterDataService.getCurrentUser(),控制器中的getCurrentUser()函数应该如何工作。上面的初始化对我来说很有意义。我不够精确。我试图实施你的建议,只是看到我的“服务”实际上是“工厂”。所以添加一个引用变量是不可能的?!此外,我不想将业务登录放在makles调用后端的服务/工厂中。我能把它放到MasterDataService里吗?基本上我的问题是:我需要做什么才能将Manipulated对象从MasterDataService返回到控制器?明白了。非常感谢您的努力@calebboyd!这真的很有帮助。按照你的建议做了。需要再次重构我的代码,以实现将业务逻辑放入模型的想法。目前我真的不知道该怎么做,因为我的结果对象总是在回调中处理的,我在将它们分配给范围变量时会照原样处理它们。但我会找到答案;)再次非常感谢。祝你周末愉快;)
getCurrentUser: function (optionsData) {
$log.debug("UserService.getCurrentUser.start");
var promise = $http({
method: 'GET',
url: '/api/User'
}).then(function (response) {
var deferred = $q.defer();
$log.debug("UserService.changeOptions.success.status: " + response.status);
if (response.status == 200) {
deferred.resolve(response);
return deferred.promise;
}
deferred.reject('OptionsNotChanged');
return deferred.promise;
}, function (response) {
$log.debug("UserService.changeOptions.error.status: " + response.status);
return $q.reject('OptionsNotChanged');
});
return promise;
},
angular.module('myApp',[])
.factory('MasterDataService',function($http){
var currentUser = {};
return {
getCurrentUser: function(any,param,you,need){
currentUser.$promise = $http({...}).then(function(response){
var mainpulateUser = response.data;
//do business logic,
return angular.extend(currentUser,manipulatedUser);
});
return currentUser;
}
};
})
.controller('myCtrl',function(MasterDataService,$scope,$log){
$scope.buttonTitle = 'UpdateUser';
$scope.user = MasterDataService.getCurrentUser();
$scope.user.$promise.then(function(user){
$log.debug($scope.user === user);
$log.debug('current user -> ',$scope.user);
});
$scope.getCurrentUser = function(){
MasterDataService.getCurrentUser();
}
});
angular.factory('User',function(){
var User = function(initWith){
initWith = initWith || {};
this.firstName = initWith.firstName || ''
this.lastName = initWith.lastName || ''
this.position = 'employee'
this.lastRetrieved = new Date();
}
User.prototype.doBusinessLogic = function(position){
this.position = position;
}
return User;
});