2016-11-30 6 views
2

私のAppのlocalStorageに私はauthのトーク​​ンを保存しました。ユーザーが完全にリロードする場合は、このトークンを確認してユーザー名を取得するためにバックエンドに要求する必要があります。このセッションのすべてのものについて、私はemberサービスを作った。 私のアプリケーションのルートは次のようになります。リロードオンルートをレンダリングする前にEmberでリクエストする

import Ember from 'ember'; 
export default Ember.Route.extend({ 
    currentSession: Ember.inject.service(), 
    beforeModel: function(transition) { 
     if (transition.targetName !== 'login') { 
      const session = this.get('currentSession'); 
      if (!session.isLoggedIn) { 
       this.transitionTo('login'); 
      } 
     } 
    } 
}); 

アプリケーションルート上beforeModelメソッドがトリガされ、そして、私はサービスからisLoggedInプロパティを取得することができます。サービスで

私はINITで呼び出されinitializeService方法があります。これは基本的に動作しますが、競合状態が原因の非同期要求findReocordであり

import Ember from 'ember'; 
export default Ember.Service.extend({ 
    store: Ember.inject.service(), 
    username: '', 
    isLoggedIn: false, 

    initializeService: function() { 
     const token = localStorage.getItem('Token'); 
     if (token) { 
      const self = this; 
      this.get('store').findRecord('session', token).then(function(session) { 
       self.set('username', session.get('username')); 
       self.set('isLoggedIn', true); 
      }); 
     } 
    }.on('init'), 
}); 

を。 initializeServicethis.get('currentSession');の中でbeforeModelに呼び出されず、サービスがバックエンドを要求している間にbeforeModelが続行されます。したがって、if (!session.isLoggedIn)は常にtrueです。 インスタンスイニシャライザを使用してサービスを初期化しようとしましたが、それも動作しませんでした。私は何らかの同期をとる必要があると思う。findRecord

同期要求を行う可能性はありますか、それとも良い方法がありますか?

答えて

1

プロミスを返す現在のセッションサービスでloadCurrentUserという名前のメソッドを導入し、beforeModelを使用してロジックを実装するthenメソッドを導入します。

サンプルコード、 電流session.jsサービスファイル

import Ember from 'ember'; 
export default Ember.Service.extend({ 
    store: Ember.inject.service(), 
    username: '', 
    isLoggedIn: false, 
    init() { 
     this._super(...arguments); 
     this.loadCurrentUser(); //if you are not calling loadCurrentUser method then this will ensure username and isLoggedIn set properly 
    }, 
    loadCurrentUser() { 
     return new RSVP.Promise((resolve, reject) => { 
      const token = localStorage.getItem('Token'); 
      if (!isEmpty(token)) { 
       return this.get('store').findRecord('session', token).then((session) => { 
        this.set('username', session.get('username')); 
        this.set('isLoggedIn', true); 
        resolve(); 
       }, reject); 
      } else { 
       resolve(); 
      } 
     }); 
    } 
}); 

application.jsルートファイル

import Ember from 'ember'; 
export default Ember.Route.extend({ 
    currentSession: Ember.inject.service(), 
    beforeModel: function(transition){ 
     return this.get('currentSession').loadCurrentUser().then((result) => { 
      if (transition.targetName !== 'login') { 
       const session = this.get('currentSession'); 
       if (!session.isLoggedIn) { 
       this.transitionTo('login'); 
       } 
      } 
     } 
    },  
}); 
+0

おかげでたくさん、私はできるだけ早くことをしようとします –

関連する問題