你能用 emberjs 延迟服务吗?

Can you have deferred services with emberjs?

我正在尝试使用 Ember CLI 从似乎不适合使用 Ember 数据的遗留 API 加载数据。这些数据通常会在页面加载时加载,然后在整个应用程序的许多地方重复使用。我为此创建了一个服务 'legacy_data':

import Ember from 'ember';

export default Ember.Service.extend({
  ready: null,
  legacy_data: null,

  init(){
   this.ready = Ember.$.ajax( ... ).done(function(legacy_data){
     this.set('legacy_data', legacy_data);
  }

  computed_attr: Ember.computed('legacy_data', function(){ ... },

  ...more functions and computed attributes
});

因为'init'函数似乎不支持返回一个承诺(就像路由上的模型钩子一样),每当我想使用这个服务时,我必须做这样的事情:

injected_service.ready.then(function(legacy_data){
 ... use service
});

这实际上意味着我最终会在我的代码库中进行一大堆额外的承诺处理 - 感觉我在这方面逆流而上。

有更好的方法吗?也许是生命周期挂钩或支持延迟服务初始化的 factory/initializer,这样我就不必担心代码库中的其他任何地方?初始化器支持这个吗?我没有在它的任何例子中看到它。是否有解决此问题的替代方法? (Ember 数据必须以某种方式处理同样的问题,但我是框架的新手所以不确定)

感谢您的帮助。

我认为您应该将代码从 init 挂钩移至函数 loadData(或您喜欢的任何名称),然后从 beforeModel 调用此函数申请途径。这将确保数据始终加载。

在Ember中,Route有beforeModelmodelafterModel等hook。如果您 return 来自这些钩子的承诺,承诺处理由 Ember 完成。

顺便说一下,即使你使用的是Ember数据,调用store也应该通过路由完成。如果您访问组件中的商店,您需要再次处理承诺。

但是,您正在询问一种将申请推迟到承诺解决的方法。这可以通过 application routes beforeModel 钩子来实现。 (我需要这个来检索我的客户端应用程序中的用户权限。由于我无法在我的所有路由中放置权限承诺处理,我将它放在我的 application route 中。)所以,看看 this twiddle.