在 Ember 中处理网络连接和承诺拒绝

Sam*_*off 5 ember.js

我正在尝试实现一个应用程序级错误处理程序来捕获我的应用程序中失败的承诺。我在这方面看到的大多数建议都与错误记录有关,但我实际上想触发一个模式窗口,让我的用户知道他们不再连接到互联网 + 只能读取数据。

我想从RSVP.onerror处理程序中触发一个动作。到目前为止,我设法做到这一点的唯一方法是使用以下方法:

Ember.RSVP.configure('onerror', function(e) {
  window.App.__container__
    .lookup('controller:application')
    .send('showModal', 'disconnected');
});
Run Code Online (Sandbox Code Playgroud)

但对我来说似乎有点hacky。

有没有更合适的地方来编写这段代码?更一般地说,是否有关于通知用户互联网连接丢失的最佳做法?

Dun*_*ker 2

Ember 有一个内置的错误路由(文档在这里)

根据您希望如何处理应用程序中的其他类型的错误,您可以在该视图中添加views/error.js并运行一个方法willInsertElement来测试用户是否离线,如果为真,则发送操作showModal

或者,失败的 Promise 可以自动被捕获在原始 Promise 中,并触发一些已注入控制器或任何发出 Promise 的实例的方法:

控制器

this.set('thing').then(function() {
  // Success
}, this.offlineError()); // Failure
Run Code Online (Sandbox Code Playgroud)

初始化器(注意语法适用于 ember-cli):

export default {
  name: 'offline-error',

  initialize: function(container, app) {
    var offlineError = function() {
      // or something like this
      container.lookup('controller:application').send('showModal', 'disconnected');
    };

    app.register('offlineError', offlineError, { instantiate: false });

    // Inject into routes, controllers, and views.
    Em.A(['route', 'controller', 'view']).forEach(function(place) {
      app.inject(place, 'offlineError', 'offlineError:main');
    });
  }
};
Run Code Online (Sandbox Code Playgroud)

上面的代码使offlineError方法在所有路由、控制器和视图中可用,但它的美妙之处在于该方法无需使用hacky私有属性即可访问容器。