3.8.4这段加载图片的代码怎么才能不报错啊。。。

demo.rar (71.8 KB)

客户端有N个图标,ID是1到N
服务器会发来一部分图标ID
客户端根据服务器的ID来加载图标
demo里只有40多个图标,但是实际上更多
加载代码如下
private async showIcon()

{

    const SpriteIcon : Node = this.node.getChildByName("SpriteIcon")

    const serverData : Array<string> = [] //这个数据实际上是服务器发的,这里用for模拟填充一下

    for (let index = 1; index <= 41; index++)  

    {

        const aaa = "folder/" + js.formatStr("%s",index) + "/spriteFrame"

        serverData.push(aaa)

    }

    const rl = new ResourcesLoad()

    for (let index = 0; index < serverData.length; index++)

    {

        const element = serverData[index]

        log(element)

        const a = await rl.load( "test" , element , SpriteFrame )

        const newIcon = instantiate(SpriteIcon)

        newIcon.getComponent(Sprite).spriteFrame = a

        this.node.addChild(newIcon)

    }

}

现在问题是
图标还在加载中,提前关闭界面,会报错。。。
用3.8.4打开
点击右上角的打开按钮,然后快速点关闭就会报错了
img_v3_02e4_89fd8ecb-9589-403f-8bd8-2cb7def457bg

你demo中40个 但是你for遍历到了41

我看了demo资源
是放了41个图标没错呀。。。
:astonished:
等他正常加载完再关闭界面,就不会报错,正在加载的时候关闭界面就会报错

你是异步的,关闭界面 是不会中断 await的执行 等他执行过来的时候 你都销毁界面了
const SpriteIcon : Node = this.node.getChildByName(“SpriteIcon”)
这个SpriteIcon 已经无效了
在await下句加这个代码处理

   if(!cc.isValid(SpriteIcon ,true))return

看这报错,你中途关闭之后节点应该是销毁了,相对应的子节点也销毁了,引用变成了nil

instantiate的之前加判断isValid(SpriteIcon)

可以了~不报错了~谢谢~