私の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'),
});
を。 initializeService
はthis.get('currentSession');
の中でbeforeModel
に呼び出されず、サービスがバックエンドを要求している間にbeforeModel
が続行されます。したがって、if (!session.isLoggedIn)
は常にtrueです。 インスタンスイニシャライザを使用してサービスを初期化しようとしましたが、それも動作しませんでした。私は何らかの同期をとる必要があると思う。findRecord
。
同期要求を行う可能性はありますか、それとも良い方法がありますか?
おかげでたくさん、私はできるだけ早くことをしようとします –