- Creator 版本:v1.9.1
问题:
在调用cc.loader.loadResDir前对cc.loader.onProgress赋值,不会触发onProgress回调,只有在调用传入时才会生效,查看CCLoader的源代码发现是下面这个_parseLoadResArgs
函数有bug导致的,先贴该函数的源码:
proto._parseLoadResArgs = function (type, onProgress, onComplete) {
if (onComplete === undefined) {
var isValidType = cc.isChildClassOf(type, cc.RawAsset);
if (onProgress) {
onComplete = onProgress;
if (isValidType) {
onProgress = this.onProgress || null;
}
}
else if (onProgress === undefined && !isValidType) {
onComplete = type;
onProgress = this.onProgress || null;
type = null;
}
if (onProgress !== undefined && !isValidType) {
onProgress = type;
type = null;
}
}
return {
type: type,
onProgress: onProgress,
onComplete: onComplete,
};
}
这是loadResDir的源码
proto.loadResDir = function (url, type, progressCallback, completeCallback) {
var args = this._parseLoadResArgs(type, progressCallback, completeCallback);
type = args.type;
progressCallback = args.onProgress;
completeCallback = args.onComplete;
var urls = [];
var uuids = resources.getUuidArray(url, type, urls);
this._loadResUuids(uuids, progressCallback, completeCallback, urls);
};
代码分析:
1. 对cc.loader.onProgress赋值,调用时只传入url和onComplete的回调(无效,有bug)
``cc.loader.onProgress = function(completedCount, totalCount, item ) {…}
cc.loader.loadResDir(url, function(err, assets) {…})```
此时_parseLoadResArgs的type是function类型,onProgress和onComplete为空值,isValidType会为false,于是会走到下面这个分支:
本来该函数的本意也就是把type的值赋值给onComplete, 同时把cc.loader.onProgress的值赋值给onProgress,函数走到这儿就应该结束了。但是由于此时onProgress赋值后不为空,会错误进入下面的分支:
导致onProgress被type赋值了,而type又在前面的分支被置空了,所以onProgress也会被置空,所以会导致cc.loader.onProgress赋值无效。
2. 调用时直接加上onProgress的回调(有效)
cc.loader.loadResDir(url, function(completedCount, totalCount, item ), function(err, assets) {...})
此时_parseLoadResArgs的type和onProgress是function类型,onComplete为空,isValidType会为false,首先会走到下面这段分支:
把onProgress赋值给onComplete,然后继续往下走进入另外一个分支:
type赋值给onProgress,所以调用时传入onProgress是没有问题的。