Javascript 在呈现路由之前,在Ember中请求
在我的应用程序的Javascript 在呈现路由之前,在Ember中请求,javascript,ember.js,promise,Javascript,Ember.js,Promise,在我的应用程序的localStorage中,我为auth存储了一个令牌。如果用户进行完全重新加载,我需要向后端发出请求,以验证此令牌并获取用户名。对于所有这些会议的东西,我做了一个余烬服务。 我的申请路线如下所示: import Ember from 'ember'; export default Ember.Route.extend({ currentSession: Ember.inject.service(), beforeModel: function(transitio
localStorage
中,我为auth存储了一个令牌。如果用户进行完全重新加载,我需要向后端发出请求,以验证此令牌并获取用户名。对于所有这些会议的东西,我做了一个余烬服务。
我的申请路线如下所示:
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
属性
在服务中,我有一个initializeService
方法,该方法在init上调用:
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'),
});
这基本上是可行的,但由于异步请求findReocord
,存在竞争条件<直到this.get('currentSession'),才会调用code>initializeService
在beforeModel
中,当服务请求后端时,beforeModel
继续。因此,if(!session.isLoggedIn)
总是正确的。
我之前尝试使用实例初始值设定项初始化服务,但也没有成功。我想我需要制作某种同步的findRecord
是否有可能执行同步请求或有更好的方法?在当前会话服务中引入名为
loadCurrentUser
的方法,该方法返回Promise,并在beforeModel
中使用然后方法来实现您的逻辑
示例代码,
当前会话.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');
}
}
}
},
});