将AngularJS API服务中的值返回给控制器

Luc*_*nes 1 javascript api service factory angularjs

如果我有一个看起来像这样的服务:

app.factory('User', function($http, User) {
    var User = function(data) {
        angular.extend(this, data);
    };
    User.prototype.create = function() {
        var user = this;

        return $http.post(api, user.getProperties()).success(function(response) {
            user.uid = response.data.uid;
        }).error(function(response) {

        });
    };

    User.get = function(id) {
        return $http.get(url).success(function(response) {
            return new User(response.data);
        });
    };

    return User;
});
Run Code Online (Sandbox Code Playgroud)

如何在控制器中获取Userget()函数中创建的内容?

目前我所拥有的是:

app.controller('UserCtrl', function($scope, User) {
    $scope.user = null;

    User.get($routeParams.rid).success(function(u) {
        $scope.user = new User(u.data);
    });
});
Run Code Online (Sandbox Code Playgroud)

问题在于UserCtrl获得api响应,而不是从success()工厂返回的值.我更喜欢在工厂制作新用户,而不是将api响应传递给控制器​​.

小智 5

编辑:2015年5月5日

在尝试回答这个问题时,我了解了延迟的反模式.

因此我们可以避免使用$q.defer()和使用以下代码来实现相同的结果.

服务

User.get = function(id) {
    return $http.get(url).then(function(response) {
        return new User(response.data);
    });
};
Run Code Online (Sandbox Code Playgroud)

调节器

User.get($routeParams.rid).then(function(u) {
    $scope.user = u;
});
Run Code Online (Sandbox Code Playgroud)

原始答案如下:

我认为您正在寻找的$q服务是允许您对来自异步$http服务的响应进行一些后处理,然后将其作为承诺返回给控制器.查看https://docs.angularjs.org/api/ng/service/$q文档

因此$q,请在您的工厂注入服务并更改您的User.get功能,如下所示.

User.get = function(id) {
    var deferred = $q.defer();

    $http.get(url).success(function(response) {
        deferred.resolve(new User(response.data));
    }).error(function(error) {
        deferred.reject(error);
    });

    return deferred.promise;
};
Run Code Online (Sandbox Code Playgroud)

然后在你的控制器中你可以做到

User.get($routeParams.rid).then(function(u) {
    $scope.user = u;
}, function(error) {
    //log error
});
Run Code Online (Sandbox Code Playgroud)