-1

这更像是一个设计问题:

我有一个 angularJS 应用程序,
这个应用程序使用服务与具有登录功能的 API 进行通信......

app.service('managerApiService', function($q){
    var myApi = new WWW_Wrapper(...);
    myApi.setInput('www-asynchronous', true);

    var defer = $q.defer();

    this.login = function(){
        ...
    };

    this.logout = function(){
        ...
    };

    this.getShops = function(){     
        ...
        return defer.promise;
    }
});

和另一个处理用户登录/凭据/信息的服务:

app.service('loginService', function(){
    this.credentials = {username: null, password: null };
    this.loginData = null; // comes from server during login...

    this.login = function(){
        ...
    };

    this.logout = function(){
        ...
    };
});

我的问题是:

  • 我应该LoginService注入managerApiService并更新它的凭据吗?
  • 我应该managerApiService注入LoginService并注意它的凭据吗?
  • 我应该将它们组合成一项服务吗?

还有什么想法吗?

4

1 回答 1

1

我这样做的方式是,通常有一个服务负责与 API 通信但不关心状态。它只关心创建请求和返回结果。然后,我有另一个处理会话的服务,该服务处理状态(用户名、密码等)。该服务(会话)被注入 API 服务,并调用它的方法。但是,API 永远不会知道此服务器的存在。

更详细地说,我通常有一个服务负责与后端通信(我假设它类似于你的 managerApiService)。像这样:

app.service('managerApiService', [ '$q', function ( $q ) {
    this.login = function ( credentials ) {
        // ...
    };

    this.logout = function () {
        // ...
    };
} ] );

请注意,此服务不存储与登录或会话相关的任何信息。

然后我使用另一个负责维护会话的服务,这意味着它存储当前的用户 ID、用户的信息、权限或其他任何必要的信息。此服务将实际执行登录的任务委托给前一个服务,它可能看起来像这样

app.service('loginService', [ 'managerApiService', function ( managerApiService ) {
    this.loginData = null;

    this.login = function ( credentials ) {
        return managerApiService.login( credentials ).then( /* ... */ );
    };

    this.logout = function () {
        ...
    };
} ] );

主要优点是什么:由于与服务器的通信是抽象的,你可以改变服务器的工作方式,只需要更新 API 服务。或者您甚至可以添加新的登录提供程序,您的应用程序甚至不需要知道。API 将负责发出适当的请求。

基本上,您走在正确的道路上。我要做的唯一区别是不将凭据存储在 LoginService 上,而是将它们存储在视图或控制器上。这是因为 LoginService 在整个应用程序中都保持活动状态,而不仅仅是登录屏幕,并且在执行登录后不需要将凭据存储在内存中。

至于错误,我让服务器返回一个错误代码,比如 400 或 401。然后在控制器上,我通常会监听一个.catch来处理错误,通常会在范围内设置一个临时变量,说明凭据错误.

于 2015-11-02T22:56:57.033 回答