再一次吐槽异步加载文件的奇葩

我敢确定的是,做完这个项目立马投奔unity,这处处的坑真是让我太受罪了。
在做这么一个功能,一个建筑物,点击后显示功能菜单,点击菜单某一项后,加载perfab页面。执行各种给建筑物添加node的操作。
因为点击菜单后,建筑的选中状态要去掉,菜单消失掉,所以,保存在CCCLASS中的m_build 变量会设为null。

好了,高潮来了。噩梦也来了。

加载perfab因为是异步,所以执行到加载完perfab的时候,m_building已经为null。有观众说了,干什么不阻止冒泡,阻止冒泡会导致不会取消选中状态。

功能菜单是用UI编辑实现的,不使用代码,也就是给button events+1,我尝试阻止冒泡,在事件的回调中,stopPropagation。没有奏效。好吧,那我查看下冒泡的状态。
event.bubbles \\\显示为true。有冒泡。那我这么写。

console.log(event.bubbles) \\true
event.stopPropagation
console.log(event.bubbles) \\true

心中一万个草泥马飞奔而过。这stopPropagation就跟闹着玩似的。

你可以给 prefab 传递 building 数据。

怎么传好呢,cc.loader 我还没找到传入自定义参数的方法

cc.loader.loadRes(‘prefab’, function(err, prefab){
var node = cc.instantiate(prefab);
node.getComponent(‘script’).setData(data);
parent.addChild(node);
)

这不能忍,如果我是你,我就直接放弃当前项目,直奔unity了。

希望能提供异步instantiate的api @Cocos团队

event.stopPropagationImmediate()咯,我记得event.stopPropagation也是有效的呀,可能是你调用方法没加括号

不知道是你的表达能力不足,还是我的理解能力不足,不是特别明白你的问题是什么,是加载完prefab之后,拿不到建筑物的引用了吗?
如果是这样的话,是不是因为楼主对于js闭包不理解呢?js里面全是这样的东西吧。

1赞

反正听起来不像是对cocos creator的吐槽,像是没掌握js,对js的吐槽。

3赞

我也没看明白为什么要阻止冒泡,和冒泡有什么关系?

异步必然没有同步舒服的。
回调一层套一层。
还好 Promise 能用。变成链式调用,能稍微好一些吧。
我也是用了多年Unity,表示没那么夸张。

最终还是更改了我的游戏逻辑,点击菜单后不取消选中

→_→听起来像是不熟悉异步

看起来像是js的锅(滑稽)

没有奇葩吧……认真读读文档,执行后本次事件不再冒泡。没毛病。

同感。。。

接触了corator一年多,确实感觉引擎有很多不足,但你这个是自己的问题。。。

强烈建议能提供一套同步加载资源的方法。。。不发布h5的话异步加载资源没多大意义。

引擎bug多,可以理解,论坛上提出来了,结果没人鸟。。。发个帖子,自己顶一星期都没人鸟。。如果引擎bug无法在短时间解决,至少也回复一下。。。心很累- -。。。

引擎组心也很累,这里是社区,又不是官方免费服务区。。。