Сервис AngularJS не может получить доступ к своим собственным функциям при использовании через провайдера

Вот мой провайдер:

class testPr {
 ....
 /** @ngInject */
  $get($rootScope, $timeout, $window, FacebookService) {
    const _this = this;
    this.sdkInit($rootScope, $timeout, $window);
    FacebookService.setPermissions(this.permissions);
    const providerFunc = {
      getConfig: () => {
        return _this.config;
      },
      API_METHOD: FacebookService.API_METHOD,
      PICTURE_TYPE: FacebookService.PICTURE_TYPE,
      api: FacebookService.api,
      checkLoginStatus: FacebookService.checkLoginStatus,
      getUser: FacebookService.getUser,
      getUserPicture: FacebookService.getUserPicture,
      login: FacebookService.doLogin,
      logout: FacebookService.doLogout,
      setPermissions: FacebookService.setPermissions
    };
    angular.extend(providerFunc, FacebookService);
    return providerFunc;
  }
}

А вот мой пример сервиса:

class FacebookService {
....
 checkLoginStatus(forcelogin) {
    const _this = this;
    const deferred = this.$q.defer();
    forcelogin = (angular.isUndefined(forcelogin) || forcelogin === null) ? true : forcelogin;

    this.$window.FB.getLoginStatus(response => {
      if (response.status === 'connected') {
        _this.currentUserAuthResponse = response.authResponse;
        deferred.resolve(_this.currentUserAuthResponse);
      } else if (forcelogin) {
        deferred.promise = _this.doLogin();
      } else {
        deferred.reject({response: null, reason: 'Not logged in'});
      }
    });

    return deferred.promise;
  }
  doLogin() {
    const _this = this;
    const deferred = this.$q.defer();
    this.$window.FB.login(
      response => {
        if (response.authResponse) {
          _this.currentUserAuthResponse = response.authResponse;
          deferred.resolve(_this.currentUserAuthResponse);
        } else {
          deferred.reject('Not authorized!');
        }
      },
      {
        scope: _this.settings.permissions
      }
    );
    return deferred.promise;
  }
....
}

Теперь, когда я использую провайдера в моем контроллере, все работает нормально, но когда _this.doLogin() вызывается изнутри службы в checkLoginStatus Функция выше, я получаю ошибку, что doLogin не определено. Однако, если я использую _this.login() работает, так как эта функция возвращается через провайдера. Как сделать так, чтобы сервисные функции обращались друг к другу напрямую?

Редактировать: я знаю, как размах this изменения в обратных вызовах, и как использовать это в таких сценариях. Мой вопрос заключается в том, что я должен использовать в случае, упомянутом в моем вопросе, так как вызов методов обслуживания через провайдера внутри контроллера сдвигает this область действия поставщика, даже если сервисные функции вызываются внутри самой службы?

0 ответов

Другие вопросы по тегам