1

我目前正在开发一个 Angular 前端,试图通过使用轻风或 restangular 来避免使事情过于复杂,但仍然可以正确编码。问题是我的代码在写了几行之后似乎比其他任何东西都臃肿。

关键是将用户保存在cookie中,并在有人登录时同时返回。

身份验证服务

var userResource = $resource('/users/:id');
    var currentUser = $cookieStore.get("user") || {};
    返回 {
        当前用户:当前用户,
        登录:函数(用户ID,类型,回调){
            var thiz = 这个;
            return userResource.save({id: userId}, {}, function(promise) {
                promise.then(函数(结果){
                    thiz.currentUser = 结果.数据;
                    $cookieStore.put("用户", thiz.currentUser);
                    如果(回调){
                        回调(thiz.currentUser);
                    }
                });
            });
        },
        用户:函数(){
            返回 userResource.query();
        }
    };

AuthCtrl 控制器

    $scope.login = function(userId, type) {
        Auth.login(userId, type, function(result) {
            $scope.user = 结果;
        });
    };
    Auth.login("someuser", 'basic', function(result) {
        $scope.user = 结果;
    });
    $scope.users = Auth.users();

在另一个控制器中:

    $scope.user = Auth.currentUser;    
    Snippets.query({user: $scope.user.id}, function(snippets) {
        $scope.snippets = 片段;
    });

我在服务中解决承诺的原因是因为我想保存 currentUser 并将其放在 cookieStore 中(它可能在手机上不可用,但无论如何)。

问题是这样做我不是返回承诺而是返回资源,这迫使我在所有登录调用中传递回调。

有没有更好的办法 ?

4

1 回答 1

1

您可以将资源包装在一个 Promise 中,然后返回该 Promise。这应该有效:

var userResource = $resource('/users/:id');
    var currentUser = $cookieStore.get("user") || {};
    return {
        currentUser: currentUser,
        login: function(userId, type, $q) {
            var self = this;
            var deferred = $q.defer();
            // return currentUser if it is present.
            if (this.currentUser.id) {
              return $q.when(this.currentUser);
            }
            userResource.save({id: userId}, {}, function(response) {
              if (!response.error) {
                self.currentUser = response.data;
                $cookieStore.put("user", self.currentUser);
                deferred.resolve(self.currentUser);
              } else {
                deferred.reject(response.error);
              }
            });
          return deferred.promise;
        },
        users: function() {
            return userResource.query();
        }
    };
于 2013-07-13T16:49:32.660 回答