@@ -586,6 +586,7 @@ cc.loader = (function () {
586
586
_register = { } , //register of loaders
587
587
_langPathCache = { } , //cache for lang path
588
588
_aliases = { } , //aliases for res url
589
+ _queue = { } , // Callback queue for resources already loading
589
590
_urlRegExp = new RegExp (
590
591
"^" +
591
592
// protocol identifier
@@ -668,6 +669,10 @@ cc.loader = (function () {
668
669
return results ;
669
670
} ,
670
671
672
+ isLoading : function ( url ) {
673
+ return ( _queue [ url ] !== undefined ) ;
674
+ } ,
675
+
671
676
/**
672
677
* Load js files.
673
678
* If the third parameter doesn't exist, then the baseDir turns to be "".
@@ -890,6 +895,12 @@ cc.loader = (function () {
890
895
return img ;
891
896
}
892
897
898
+ var queue = _queue [ url ] ;
899
+ if ( queue ) {
900
+ queue . callbacks . push ( callback ) ;
901
+ return queue . img ;
902
+ }
903
+
893
904
img = new Image ( ) ;
894
905
if ( opt . isCrossOrigin && location . origin !== "file://" )
895
906
img . crossOrigin = "Anonymous" ;
@@ -898,24 +909,53 @@ cc.loader = (function () {
898
909
this . removeEventListener ( 'load' , loadCallback , false ) ;
899
910
this . removeEventListener ( 'error' , errorCallback , false ) ;
900
911
901
- cc . loader . cache [ url ] = img ;
902
- if ( callback )
903
- callback ( null , img ) ;
912
+ if ( ! _urlRegExp . test ( url ) ) {
913
+ cc . loader . cache [ url ] = img ;
914
+ }
915
+
916
+ var queue = _queue [ url ] ;
917
+ if ( queue ) {
918
+ callbacks = queue . callbacks ;
919
+ for ( var i = 0 ; i < callbacks . length ; ++ i ) {
920
+ var callback = callbacks [ i ] ;
921
+ if ( callback ) {
922
+ callback ( null , img ) ;
923
+ }
924
+ }
925
+ queue . img = null ;
926
+ delete _queue [ url ] ;
927
+ }
904
928
} ;
905
929
906
930
var self = this ;
907
931
var errorCallback = function ( ) {
908
932
this . removeEventListener ( 'error' , errorCallback , false ) ;
909
933
910
- if ( img . crossOrigin && img . crossOrigin . toLowerCase ( ) === "anonymous" ) {
934
+ if ( img . crossOrigin && img . crossOrigin . toLowerCase ( ) === "anonymous" ) {
911
935
opt . isCrossOrigin = false ;
912
936
self . release ( url ) ;
913
937
cc . loader . loadImg ( url , opt , callback ) ;
914
- } else {
915
- typeof callback === "function" && callback ( "load image failed" ) ;
938
+ } else {
939
+ var queue = _queue [ url ] ;
940
+ if ( queue ) {
941
+ callbacks = queue . callbacks ;
942
+ for ( var i = 0 ; i < callbacks . length ; ++ i ) {
943
+ var callback = callbacks [ i ] ;
944
+ if ( callback ) {
945
+ callback ( "load image failed" ) ;
946
+ }
947
+ }
948
+ queue . img = null ;
949
+ delete _queue [ url ] ;
950
+ }
916
951
}
917
952
} ;
918
953
954
+ _queue [ url ] = {
955
+ img : img ,
956
+ callbacks : callback ? [ callback ] : [ ]
957
+ } ;
958
+
919
959
img . addEventListener ( "load" , loadCallback ) ;
920
960
img . addEventListener ( "error" , errorCallback ) ;
921
961
img . src = url ;
0 commit comments