2017-01-16 7 views
0

Я получаю следующее сообщение об ошибке:.then не определен на devicesIsReady

Uncaught TypeError: loginService.verificarSesion(...).then is not a function

Я думаю, что я не понимаю прекрасно обещание

мне нужно проверить, если пользователь вошел в систему на deviceIsReady на моем приложении apache-cordova. Это часть функции:

.run(function($ionicPlatform, $http, $state, loginService) { 
    $ionicPlatform.ready(function() { 

     loginService.verificarSesion() 
      .then(function(usuario) { 
       if(usuario == 1){ 
        //es complejo 
        $state.go('app.home'); 
       } 
       else if(usuario == 2){ 
        //es usuario comun 
        $state.go('app.home-usuario'); 
       } 
       else{ 
        //no se renococió ningún usuario válido 
        $state.go('app.login'); 
       } 
      }) 
      .catch(function(e){ 
       console.log('error trying to find the user'); 
      }); 
    }); 
}) 
.config(function($urlRouterProvider) { 
    // if none of the above states are matched, use this as the fallback 
    $urlRouterProvider.otherwise('/app/login'); 
}); 

Услуга:

(function() { 
    'use strict'; 

    angular 
     .module('example.login') 
     .factory('loginService', loginService); 

    loginService.$inject = ['$http','remoteDataService', '$q','_','localStorageService']; 

    /* @ngInject */ 
    function loginService($http, remoteDataService, $q,_, localStorageService){ 
     var token = 'token'; 
     var usuario = 'usuario'; 

     var service = { 
      verificarSesion: verificarSesion 
     }; 
     return service; 

     //funcion para saber si hay una sesión activa 
     function verificarSesion() { 
      var usuariologueado = localStorageService.get(token) || []; 
      if (usuariologueado == []){ 
       return []; 
      } 
      return localStorageService.get(usuario); 
     } 

     //generar error si hubo un problema 
     function generarError(e){ 
      if (e.message) { 
       return $q.reject(e.message); 
      } 
      return $q.reject('Hubo un problema al conectarse al servidor. Intente nuevamente.'); 
     } 

    } 
})(); 

Если пользователь вошел в системе я должен сено пользователя на другую точку зрения.

Что я делаю неправильно? Спасибо!

+0

Отступ здесь несовместим, и это затрудняет выполнение вашего кода. Почему вы отступаете от закрывающих скобок на 'if'? Это чрезвычайно непослушный стиль. Причина, по которой я жалуюсь, состоит в том, что код обратного вызова и обещания должен быть очень тщательно вложенным или он не будет работать так, как вы ожидаете. – tadman

+0

Хорошо, позвольте мне исправить это –

+0

Я скопировал код в sublime tex и изменил идентификатор @tadman –

ответ

0

В вашем коде довольно ясно, что функция verificarSesion может возвращать пустой массив, конечно, массив не имеет метода .then().

Согласно документу here, ваш звонок localStorageService.get(usuario) возвращает любое значение, сохраненное в localStorage. Вы уверены, что сохраните Promise с ключом 'usuario'?

Я полагаю, вам нужно будет что-то вроде этого:

function verificarSesion() { 
     var usuariologueado = localStorageService.get(token) || []; 

     if (usuariologueado == []){ 
      return new Promise(function (res, rej) { 
       $http 
        // change this if you need to post application/x-www-form-urlencoded 
        .post('login_url', {username: usuario, password: 'abc'}) 
        .then(
         function (resp) { 
          // initiate the session in the localStorage 
          localStorageService.set(usuario, resp.data); 
          res(localStorageService.get(usuario)); 
         }, 
         function(err) { 
          // error occured, notify user 
          rej(err); 
         } 
        ); 
      }); 
     } 
     return new Promise(function (res, rej) { 
      // resolve immediately 
      res(localStorageService.get(usuario)); 
     }); 
    } 

Есть еще много вопросов с указанным кодом, например, что usuariologueado используется для? что такое token? почему вы получаете пользовательскую сессию напрямую с localStorage с чем-то вроде username? и т. д.

Если вы хотите получить сеанс пользователя, вы можете посмотреть sessionStorage вместо localStorage.