Javascript 用于内嵌.svg文件的AngularJS缓存服务(用承诺包装$http)
我已经实现了一个angularJavascript 用于内嵌.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
指令来内联加载.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-谢谢。