Skip to content

Commit d02fdeb

Browse files
committed
Add callback queue to solve concurrent loading issue
1 parent 93c1b74 commit d02fdeb

File tree

1 file changed

+46
-6
lines changed

1 file changed

+46
-6
lines changed

Diff for: CCBoot.js

+46-6
Original file line numberDiff line numberDiff line change
@@ -586,6 +586,7 @@ cc.loader = (function () {
586586
_register = {}, //register of loaders
587587
_langPathCache = {}, //cache for lang path
588588
_aliases = {}, //aliases for res url
589+
_queue = {}, // Callback queue for resources already loading
589590
_urlRegExp = new RegExp(
590591
"^" +
591592
// protocol identifier
@@ -668,6 +669,10 @@ cc.loader = (function () {
668669
return results;
669670
},
670671

672+
isLoading: function (url) {
673+
return (_queue[url] !== undefined);
674+
},
675+
671676
/**
672677
* Load js files.
673678
* If the third parameter doesn't exist, then the baseDir turns to be "".
@@ -890,6 +895,12 @@ cc.loader = (function () {
890895
return img;
891896
}
892897

898+
var queue = _queue[url];
899+
if (queue) {
900+
queue.callbacks.push(callback);
901+
return queue.img;
902+
}
903+
893904
img = new Image();
894905
if (opt.isCrossOrigin && location.origin !== "file://")
895906
img.crossOrigin = "Anonymous";
@@ -898,24 +909,53 @@ cc.loader = (function () {
898909
this.removeEventListener('load', loadCallback, false);
899910
this.removeEventListener('error', errorCallback, false);
900911

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+
}
904928
};
905929

906930
var self = this;
907931
var errorCallback = function () {
908932
this.removeEventListener('error', errorCallback, false);
909933

910-
if(img.crossOrigin && img.crossOrigin.toLowerCase() === "anonymous"){
934+
if (img.crossOrigin && img.crossOrigin.toLowerCase() === "anonymous") {
911935
opt.isCrossOrigin = false;
912936
self.release(url);
913937
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+
}
916951
}
917952
};
918953

954+
_queue[url] = {
955+
img: img,
956+
callbacks: callback ? [callback] : []
957+
};
958+
919959
img.addEventListener("load", loadCallback);
920960
img.addEventListener("error", errorCallback);
921961
img.src = url;

0 commit comments

Comments
 (0)