我最终的实现代码,给大家做个参考吧,参照downloader.js在loader.js里改的
var Loader = function (extMap) {
this.id = ID;
this.async = true;
this.pipeline = null;
this.maxConcurrent = cc.sys.isMobile ? 5 : 512;
this._curConcurrent = 0;
this._loadQueue = [];
this.extMap = JS.mixin(extMap, defaultMap);
};
Loader.ID = ID;
JS.mixin(Loader.prototype, {
/**
* Add custom supported types handler or modify existing type handler.
* @method addHandlers
* @param {Object} extMap Custom supported types with corresponded handler
*/
addHandlers: function (extMap) {
this.extMap = JS.mixin(this.extMap, extMap);
},
handle: function (item, callback) {
var self = this;
var loadFunc = this.extMap[item.type] || this.extMap['default'];
if (CC_EDITOR || item.type == "uuid") //uuid有依赖加载,不能简单地放入并发队列
{
loadFunc.call(this, item, function (err, result) {
if (err) {
callback && callback(err);
}
else {
callback && callback(null, result);
}
});
return;
}
//对非"uuid"类型加入了并发数量控制
if (this._curConcurrent < this.maxConcurrent) {
this._curConcurrent++;
loadFunc.call(this, item, function (err, result) {
if (err) {
callback && callback(err);
} else {
callback && callback(null, result);
}
// Concurrent logic
self._curConcurrent = Math.max(0, self._curConcurrent - 1);
var delta = self.maxConcurrent - self._curConcurrent;
for(var i = 0; i < delta; ++i) {
var nextOne = self._loadQueue.shift();
if (nextOne) {
self.handle(nextOne.item, nextOne.callback);
}else{
break;
}
}
});
}
else {
this._loadQueue.push({
item: item,
callback: callback
});
}
}
});