Javascript 使用过滤器处理承诺的服务

Javascript 使用过滤器处理承诺的服务,javascript,angularjs,Javascript,Angularjs,我已经开始重新编写这段代码以同步运行,但出于好奇和支持这两种方法的愿望,我需要一些帮助来理解如何让过滤器与承诺相协调。正如其他一些帖子提到的那样,过滤器似乎只是从承诺中解决{} 基本模式 下面是一个细分: 在模块中定义一个返回承诺而不是对象的服务 module.factory('promisedSvc', ['$http', function($http) { var httpPromise = null, servicePromise = null, service =

我已经开始重新编写这段代码以同步运行,但出于好奇和支持这两种方法的愿望,我需要一些帮助来理解如何让过滤器与承诺相协调。正如其他一些帖子提到的那样,过滤器似乎只是从承诺中解决{}

基本模式 下面是一个细分:

在模块中定义一个返回承诺而不是对象的服务

module.factory('promisedSvc', ['$http', function($http) {

  var httpPromise = null,
    servicePromise = null,
    service = {},
    dataSet = {};

  var httpPromise = $http.get('somedata.json').success(function(data) {
    dataSet = data;
  });

  servicePromise = httpPromise.then(function(){
    service.getData = function(key) {
      return dataSet[key];
    };

    service.addData = function(key, value) {
      dataSet[key] = value;
    };

    return service;
  });

  /*
    In actuality I proxied the service methods onto the promise because
    I didn't want consumers of the service to have to deal with it being
    a promise. There is the caveat of setting properties on a class I 
    don't own (property collisions), a risk I'm okay taking, but YMMV

    Commented out proxies
    servicePromise.getData = function(key) {
      return this.then(function(svc){
        return svc.getData(key);
      });
    };

    servicePromise.addData = function(key, value) {
      this.then(function(svc){
        svc.addData(key, value);
      });
    };
  */

  return servicePromise;
}]);
控制器可以很好地处理这个promisedSvc,您只需将承诺注入控制器,然后使用承诺上的then函数将$scope属性的设置包装到最终服务对象的函数调用中:getDatakey或setDatakey,value。或者,如果将函数代理到promise上(如注释掉的块中所示),则可以将其视为正常

过滤器似乎不像$scope那样固有地处理承诺。我正在寻找一种方法,让过滤器注入promisedSvc,并能够调用getDatakey,而无需将其解析为{},因为承诺尚未解析。下面是一个不起作用的示例:

module.filter('svcData', ['promisedSvc', function(promisedSvc) {
  return function(input) {

    return promisedSvc.then(function(svc) {
      var value = svc.getData(input);
      return value;
    });
  };
}]);
那么,有没有一种方法可以编写过滤器来解析该值呢

用例
这就是我试图实现的简化模式。对于那些好奇的人,我的实际用例是预取i18n/l10n资源包信息,这样我就可以本地化应用程序中的所有文本。预取可能都在Javascript环境中,连接到一些已加载的全局或提供程序中,但我们也有数据库存储资源包的场景,因此我需要一个版本的代码,可以通过AJAX从服务器预取所有信息。

这不正是我要找的,但至少要记录一个解决方法:

可以在$scope上使用函数而不是过滤器

module.factory('promisedSvc', ['$http', '$rootScope', function($http, $rootScope) {

  var httpPromise = null,
    servicePromise = null,
    service = {},
    dataSet = {};

  var httpPromise = $http.get('somedata.json').success(function(data) {
    dataSet = data;
  });

  servicePromise = httpPromise.then(function(){
    service.getData = function(key) {
      return dataSet[key];
    };

    service.addData = function(key, value) {
      dataSet[key] = value;
    };

    //Here is the addition to setup the function on the rootScope
    $rootScope.svcData = function(key) {
      return service.getData(key);
    };

    return service;
  });

  return servicePromise;
}]);
然后在模板中而不是{{'key1'| svcData}}中,您将使用{{svcData'key1'}

我测试过,如果延迟承诺解析,例如在$http.success中设置等待,则影响是页面加载,但是svcData函数中的值仅在承诺解析后才会填充到模板中

如果可能的话,用一个过滤器来完成同样的任务还是不错的