AngularJS Как выполнить функцию после завершения какой-либо функции?

У меня есть страница, содержащая кнопку регистрации с помощью кнопки facebook, которую я скрыл с помощью ng-hide="fbLoggedIn", и форму ввода, которую я скрыл с помощью ng-show="fbLoggedIn"

Моя цель - зарегистрироваться с помощью кнопки facebook, которая будет скрыта, если для fbLoggedIn установлено значение true, а ввод формы будет отображаться, если для fbLoggedIn установлено значение true.

кнопка регистрации facebook ng-click="registerFb()" выполнить эту функцию

$scope.registerFB = function () {

        authService.fbLogin();
        $scope.fbLoggedIn = authService.fb_logged_in();
        console.log($scope.fbLoggedIn); //this show false even `fb_access_token` not null

    }

Вот моя функция authService.fbLogin and authService.fb_logged_in

authService.fbLogin = function () {

        var FB = window.FB;

        FB.login(function(response) {
        console.log(response);

    if (response.authResponse) {
        sessionService.set('fb_id', response.authResponse.userID);
        sessionService.set('fb_access_token', response.authResponse.accessToken);
        sessionService.set('fb_expiration_date', new Date(new Date().getTime() + response.authResponse.expiresIn * 1000).toISOString());
     //console.log('Welcome!  Fetching your information.... ');
     FB.api('/me', function(response) {
       console.log('Good to see you, ' + response.name + '.');
         console.log(response);


     });

    } else {
     console.log('User cancelled login or did not fully authorize.');
     //console.log(response);
    }
    });

};

authService.fb_logged_in = function () {
    if(sessionService.get('fb_access_token') != null){
        return true;
    }else {
        return false;       
    }
};

В другой функции я пытаюсь проверить, не является ли fb_access_token нулевым, просто чтобы убедиться, что что-то не так с моей логикой, и результат true.

С приведенным выше отладчиком я могу сказать, что $scope.fbLoggedIn = authService.fb_logged_in(); выполняется до завершения authService.fbLogin();.

Итак, как я могу выполнить $scope.fbLoggedIn = authService.fb_logged_in(); после завершения authService.fbLogin();? может быть, как достичь моей цели?


person Dark Cyber    schedule 20.11.2016    source источник
comment
Вы можете сделать это с помощью обещания. Как и в случае с переменной defer после вызова defer.resolve(), где defer=$q. И используйте первый параметр метода.then() для выполнения задачи.   -  person Tirthraj Rao    schedule 20.11.2016
comment
@TirthrajBarot, не могли бы вы ответить примером кода? может с моим кодом?   -  person Dark Cyber    schedule 20.11.2016
comment
И я думаю, вы можете сделать это и с помощью $rootScope... Просто установите $rootScope.fb_isLogin=true в своей функции входа в систему и поместите эту переменную rootScope в ng-hide   -  person Tirthraj Rao    schedule 20.11.2016
comment
@TirthrajBarot выглядит так, будто мне интересно с твоим первым комментарием: D, может быть, ты захочешь мне помочь.   -  person Dark Cyber    schedule 20.11.2016
comment
???? конечно чувак.. Дай мне 30 минут..!   -  person Tirthraj Rao    schedule 20.11.2016
comment
Я ответил!!!!!!!!!   -  person Tirthraj Rao    schedule 20.11.2016


Ответы (2)


Хорошо. Этого можно добиться с помощью обещания. Я не знаю параметров, которые вы включили в свой сервис autService, поэтому я создам одноименную фабрику с новыми параметрами, которые вам, возможно, потребуется добавить.

Следовательно, по моему мнению, именно такой должна быть ваша фабрика.

angular.module('YourModuleName').factory('authService',['$http','$q',function($http,$q){

    var obj = {};
    obj.fbLogin = function () {
        var defer = $q.defer();
        var FB = window.FB;
        FB.login(function(response) {
            console.log(response);

            if (response.authResponse) {
                sessionService.set('fb_id', response.authResponse.userID);
                sessionService.set('fb_access_token', response.authResponse.accessToken);
                sessionService.set('fb_expiration_date', new Date(new Date().getTime() + response.authResponse.expiresIn * 1000).toISOString());
                FB.api('/me', function(response) {
                   console.log(response);
                   defer.resolve('Good to see you, ' + response.name + '.');
               });

            } 
            else {
                defer.reject('User cancelled login or did not fully authorize.');
            }
        });
        return defer.promise;
    }

    obj.fb_logged_in = function () {
        if(sessionService.get('fb_access_token') != null){
            return true;
        }else {
            return false;       
        }
    };


    return obj;

}])

И таким образом, вызов функции из контроллера должен быть следующим.

$scope.registerFB = function () {
    authService.fbLogin().then(function(response){
        $scope.fbLoggedIn = authService.fb_logged_in();
        console.log($scope.fbLoggedIn);

    },function(error){
        console.error("Error : ",error);
    });
}
Note: CODE NOT TESTED.

Следовательно, это решит проблему с лучшими практиками angularJS.

person Tirthraj Rao    schedule 20.11.2016

используйте $rootscope для назначения значений, которые они предоставляют для передачи/трансляции событий и возможности подписки.

person George Otieno    schedule 20.11.2016