2017-01-16 44 views
0

我收到以下錯誤定義:。那麼是不是在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

我複製了代碼以崇高tex,它改變了身份@tadman –

回答

0

在代碼中很清楚,函數verificarSesion可以返回一個空數組,當然一個數組沒有.then()方法。

根據文檔here,您致電localStorageService.get(usuario)會返回您存儲在localStorage中的任何值。您確定您使用密鑰'usuario'存儲Promise嗎?

我想你會需要像這樣:

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? etc

如果你想要一個用戶會話,你可以看看sessionStorage而不是localStorage