Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在呈现路由之前,在Ember中请求_Javascript_Ember.js_Promise - Fatal编程技术网

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');
              }
            }
        }
    },    
});