一个很奇怪的for循环

写在问题前的说明:

我使用for循环遍历了一个data对象,在循环中,使用cc.loader.loadRes
动态加载一个预制体,但是输出发现,下标为0的预制体最后一个被加载。后台输出是这样的:

加载的代码是这样的:

所以这段代码有啥问题导致下标为零的时候被最后加载出来?

for(let i=0;i< data.length;i++)

  cc.loader.loadRes("Prefab/prop",function(err,prefab){
            if(err){
                console.error(err);
            }
            else{
                let attr={tag:i};
                let perP = cc.instantiate(prefab);
                perP.attr(attr);
                console.log(perP.tag);
                perP.getComponent("prop").fillData(GlobalData.oTempData.item[i]);
                self.Props.addChild(perP);
                // self.perPTemp.push(perP);
            }
        });
    }

果然周末没人的嘛:joy:

index0的prefab太大了,异步操作谁先完成先输出谁啊

但是这个加载的预制体都是同一个啊,预制体填充的数据都是一样的。

loadRes是异步的

异步的话,按照顺序加载同一个预制体,不应该加载的时间相同嘛?而且我在输出的时候发现0是最后一个加载出来了,那么是不是可能是这样的:第一次加载预制体的时候,需要加载很多数据信息,之后加载的时候,因为加载的同一个预制体,系统自动加载该预制体的缓存?如果这样的话,那我要解决问题的话,应该就是提前加载该预制体,之后按照需要加载就行了?

写法本身就有问题 加载同一个预制体为什么要多次去加载呢 就不能加载好了再去for循环实例化呢

1赞

楼上正解

多次加载是因为不确定个数呀,一开始没想到好方法,就是用for循环加载了。

写法确实有问题,但是输出0 更是奇怪,我也想知道为什么是这样,楼上说的异步会导致这个问题,说法太空了。同求

那for循环也可以写在加载内啊~我猜测这个creator的加载机制问题,第一次加载时间比较长,后面加载时有缓存机制的。

你的回复没有解决我跟楼主的疑问:joy:

我擦,就没有人有好奇心的么。。。。。,明显一个异步解释不了上述问题啊,追代码我也追的很懵逼,大家就看看就没得了?

就是异步啊,加载出来的顺序是不确定的,你多试几次

擦,发现这个论坛没啥大神了,这是都跑去做U3D了么,郁闷

异步怎么会按for循环的顺序呢。你可以试试递归,添加完一个再添加下一个

init = () => {
const self = this;
cc.loader.loadRes(‘Test’, cc.Prefab, (err, prefab) => {
if (err) {
cc.Log.e(err);
} else {
self.m_pPrefab = prefab;
}
});
};

可以这样用,某个关键点初始化一次;
后面使用都是 cc.instantiate(this.m_pPrefab);

我们都知道这样用:sweat_smile:,只是不知道为什么结果显示不是预期的顺序。当然肯定不是上面那样说的一个异步就可以解释清楚的,所以很疑惑。

是的,我现在就是这么做的,能够解决在循环创建的时候下标为0最后一个被实例化,但是还是不知道为嘛0是最后一个出来

是的呢,很奇怪。