Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 仅从异步调用中获取对象_Javascript_Angularjs_Angularjs Service_Angularjs Controller - Fatal编程技术网

Javascript 仅从异步调用中获取对象

Javascript 仅从异步调用中获取对象,javascript,angularjs,angularjs-service,angularjs-controller,Javascript,Angularjs,Angularjs Service,Angularjs Controller,我的目标是 显示需要在网页上操作的用户名。MNA操作应该在服务(MasterDataService)中集中完成。我想在屏幕上使用在控制器中定义的范围变量。控制器正在调用集中式服务。该服务正在调用另一个服务,该服务正在调用后端,处理用户名并将结果返回给控制器。结果应该是JSON对象,而不是已解析的请求(延迟和承诺) 网页->页面控制器->集中服务->用户服务->以及返回的方式 我就是这样做的 网页 <div id="usercontainer" ng-show="currentUser" c

我的目标是 显示需要在网页上操作的用户名。MNA操作应该在服务(MasterDataService)中集中完成。我想在屏幕上使用在控制器中定义的范围变量。控制器正在调用集中式服务。该服务正在调用另一个服务,该服务正在调用后端,处理用户名并将结果返回给控制器。结果应该是JSON对象,而不是已解析的请求(延迟和承诺)

网页->页面控制器->集中服务->用户服务->以及返回的方式

我就是这样做的

网页

<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;
});