0

Я пытаюсь проверить, если firebase user уже выполнил вход, проверив, существует ли объект user. Однако, когда я обновить страницу, firebase функция работает асинхронной загрузки страницы, прежде чем firebase вернула user объект и перенаправляется пользователь прибудете, даже если они технически вошли вAngularFire routeProvider проверить, был ли пользователь подписан в

См код ниже:.

app.config(['$routeProvider', '$locationProvider', '$waitForAuth','ngResource', function($routeProvider, $locationProvider, $waitForAuth, $ngResource) { 

    $routeProvider 
     .when('/', { 
      templateUrl: 'views/home.html', 
      controller: 'MainCtrl' 
     }) 
     .when('/signup', { 
      templateUrl: 'views/signup.html', 
      controller: 'SignupCtrl' 
     }) 
     .when('/classes', { 
       templateUrl: 'views/class_lesson.html', 
       controller: 'classLessonCtrl', 
       resolve: { 
        "firebaseUser": function($waitForAuth) { 

         //user = firebase.auth().currentUser; 
         firebase.auth().onAuthStateChanged(function(user) { 
          user = firebase.auth().currentUser; 
          if (user){ 
           console.log("user signed in"); 
           return user; 
          } 
          else { 
           //window.location.replace('/signup'); 
           console.log(user); 
           console.log("user not signed in"); 
          } 
         }); 
         * 
        } 
       } 

     }); 

    $locationProvider.html5Mode(true); 

}]); 

Я обыскал и обнаружил, что некоторые люди используют Promise.all, чтобы дождаться, когда пользовательский объект будет отсортирован, но я не уверен, как его правильно реализовать. Могу ли я получить совет? Или есть другое решение?

var p = new Promise(function(resolve, reject) { 

    // Do an async task async task and then... 
    firebase.auth().onAuthStateChanged(function(user) { 
     user = firebase.auth().currentUser; 

    }); 

    if(/* good condition */user!=null (?) { 
     resolve('Success!'); 
    } 
    else { 
     reject('Failure!'); 
    } 
}); 

p.then(function() { 
    /* do something with the result */ 
}).catch(function() { 
    /* error :(*/ 
}); 

ответ

1

Вам нужны ваши резонаторы, чтобы что-то вернуть. Для асинхронных операций это должно быть обещание (в Угловом, от $q)

resolve: { 
    firebaseUser: function($waitForAuth) { // dunno what $waitForAuth is for 
    return $q(function(resolve) { 
     firebase.auth().onAuthStateChanged(resolve) 
     // will resolve with null if not logegd in 
    }); 
    } 
}