Ember.js - 多个App.deferReadiness()和App.advanceReadiness()调用

时间:2014-08-21 11:34:54

标签: ember.js ember-cli

我正在尝试在我的应用程序中运行两个启动器。

第一个是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;

1 个答案:

答案 0 :(得分:3)

您应该使用初始值设定项的nameafter属性进行设置:

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();
  }
});