Javascript 用于内嵌.svg文件的AngularJS缓存服务(用承诺包装$http)

Javascript 用于内嵌.svg文件的AngularJS缓存服务(用承诺包装$http),javascript,angularjs,caching,svg,angular-promise,Javascript,Angularjs,Caching,Svg,Angular Promise,我已经实现了一个angular指令来内联加载.svg图像,link函数使用$http加载文件,然后解析该文件以添加和删除标记。结果是内联,可以使用css对其进行着色和调整大小 这很好,但由于我的应用程序将加载小图像,因此该解决方案不是很有效,因为angular在每个摘要中多次调用该服务,这意味着加载/解析过程将执行100次($http缓存帮助) 我试图用缓存服务替换指令的$http.get()部分 缓存服务维护已加载文件的列表,并提供准备注入的版本 我的问题是履行承诺 app.directive

我已经实现了一个angular
指令来内联加载.svg图像,link函数使用$http加载文件,然后解析该文件以添加和删除标记。结果是内联
,可以使用css对其进行着色和调整大小

这很好,但由于我的应用程序将加载小图像,因此该解决方案不是很有效,因为angular在每个摘要中多次调用该服务,这意味着加载/解析过程将执行100次($http缓存帮助)

我试图用缓存服务替换指令的
$http.get()
部分

缓存服务维护已加载文件的列表,并提供准备注入的版本

我的问题是履行承诺

app.directive()

link: function( scope, element, attrs ){
    var promise= svgService.get( svgFilename );  // was: $http.get(...)
    promise.then( 
        function(data){
            // sort injected attribs and then...
            element.replaceWith(data);
        },
        function(data){ /* error stuff */ } 
    );
};
看起来不错

服务功能大致如下:

app.service('svgCacheService', ['$q', '$http', function($q, $http){
    this.get=function( srcfile ){
        var deferred= $q.defer();

        if( srcfile in cache is loaded ){
            deferred.resolve( cache[srcfile] );
            return deferred.promise;        // ok, no problem with this
        }else{
            if( srcfile in cache marked as 'loading' ){
                // file is marked in cache, but is waiting for $http
                return SOME_PROMISE;        // tried allsorts, no luck yet :(
            }else{
                // file not in cache
                cache[srcfile]='loading';   // new cache entry, marked 'loading' 
                $http.get( srcfile )
                .success( function(data){
                    // xml parsing etc. goes in here
                    cache[srcfile]= data;

                    // how to resolve waiting promises waiting on 'loading'???

                    deferred.resolve( cache[srcfile] );
                    return deferred.promise;   // this caller is ok
                }
                .error( ... error stuff ... )
            }
        }
    }
这类工作正常,但实际上只加载了一些图像(一些图像在一个页面上多次使用,并且出现了一个奇怪的图像)-我认为问题似乎在于在“缓存正在加载”的情况下发出的一些承诺没有得到解决

我曾尝试在缓存中添加
deferred
对象,并将其返回给每个调用方,但没有任何区别

问题:

我猜我需要跟踪很多单独的承诺。。。我是否需要在缓存中保留一个包含一些承诺的数组,然后在$http成功时将它们全部解析

通常,您只能将给定的promise实例返回给一个调用方吗


如有任何提示/提示/链接,将不胜感激。。。谢谢。

所有SVG文件的总大小?SVG与图像(读取:兆字节)相比很小,我会将所有SVG缓存在浏览器中(以ZIP或LZString发送整个集合)。在~200.SVG文件中只有大约250k。。。我确实考虑过对它们进行预处理,但想让客户在需要时制作更多的图像。我的缓存是这样的,所以我只需要处理它们一次就可以插入到DOM中,这样css就可以完成它的工作。您是否尝试过修复加载/解析?尝试先修复根本原因。一次绑定看起来确实很有趣。。。我会看看我们是否可以使用新版本的angular-谢谢。