cocoscreator cc.loader.onProgress 无效bug

  • 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是没有问题的。

没人回复下吗

欸,我现在也遇到这个调用无效的,急死人,不知道怎么办

sorry,看题一半