我正在尝试在我的应用程序中运行两个启动器。
第一个是Socket.io连接,它打开一个Socket,然后将它共享给另一个初始化程序和所有控制器/路由。
第二个是会话系统,它处理cookie存储并将用户个人资料下拉到商店。
我想要做的是在第一个初始化器中使用App.deferReadiness(),在第二个初始化器中使用App.advanceReadiness()。这就是问题所在。
如果我将App.deferReadiness()调用放在第一个启动器中,将App.advanceReadiness()置于另一个启动器中,则应用程序无法启动。
如果我在两个文件中使用一对匹配的App.deferReadiness()和App.advanceReadiness(),我会收到一条错误,指出"就绪挂钩已被调用"。 (这来自第二个启动器)。
我做错了什么?
注意:我没有发布代码示例,因为我认为不需要这样做。如果是,请告诉我。
更新
/initializers/socket.js
/* Socket Initaializer */
var Initaializer = {
name: 'Socket',
initialize: function(Container, App) {
App.deferReadiness();
/* Open Socket.IO Connection */
}
};
/initializers/session.js
/* Export */
export default Initaializer;
/* Session Initaializer */
var Initaializer = {
name: 'Session',
after: 'Socket',
initialize: function(Container, App) {
// Session Code Here
App.advanceReadiness();
// Nothing Happens After This....
}
};
/* Export */
export default Initaializer;
答案 0 :(得分:3)
您应该使用初始值设定项的name
和after
属性进行设置:
Ember.Application.initializer({
name: 'init_socket',
initialize: function (container, application) {
application.deferReadiness();
// your socket init code here
//...
}
});
Ember.Application.initializer({
name: 'init_session',
after: 'init_socket',
initialize: function (container, application) {
// your session system init code here
// ...
application.advanceReadiness();
}
});
这样,您的init_session
将等待init_socket
完成,而整个应用程序仅在init_session
结束时启动。
<强>更新强>
您可以在此处看到一个实例:http://jsbin.com/zagejo/1/
我从两个不同的数组中加载商店中的用户,在deferReadiness()
和afterReadiness()
之间一个接一个地加载。
最后,一旦应用程序启动,就会加载FIXTURES。
Ember.Application.initializer({
name: 'first_load',
initialize: function (container, application) {
application.deferReadiness();
var store = container.lookup('store:main');
store.pushMany('user', firstLoad);
}
});
Ember.Application.initializer({
name: 'second_load',
after: 'first_load',
initialize: function (container, application) {
var store = container.lookup('store:main');
store.pushMany('user', secondLoad);
application.advanceReadiness();
}
});