Сервис 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
область действия поставщика, даже если сервисные функции вызываются внутри самой службы?