await或者异步回调用多了,得加isValid判断,搞得整个人都提心掉胆的

once 需要,例如在当前模块内等待其他模块完成某项操作后再继续

封装不够彻底导致的,各类的异步资源加载和事件等待,提供失效策略,然后封装。需要valid校验是因为只提供了request层的封装,没有提供业务层的封装

封装错误,不彻底,await的时候传入cancel,cancel触发时主动reject,界面destroy或者disable的时候主动cancel就行了,unity那边unitask里面是创建一个单独的脚本组件,getcanceltoken的时候直接挂一个脚本上去。

使用async await也得接受它的不足,记得包try catch ,不然报错了你就得哭。

对啊,你说的传入 cancel,就是框架层提供了断开机制

这个有很多种解决方案啊

我可以理解为“底层人”不作为么?有可能“设计者”本身不需要编程,就为难普通人,程序员发明语言为难程序员。

我是不太喜欢过度封装, 老老实实isValid很丢人吗

人和代码有一个能跑就行了 :joy:

1赞

难道你用回调就不需要判断isValid了吗?

自己封装下promise呗,然后建个基类管理下

难道你用回调就不需要判断isValid了吗?

【包教包会】Promise?async?await?终于有人把异步解释清楚了 稍微改造下就能满足了 注意自己工程的使用场景

你都异步了为啥不加个事件通知处理呢,只要销毁的时候移除事件监听不就好了

但是调试比较蛋疼

const perfab=await load(…)//等待加载资源完成
const node=cc.clone(prefab)
node.runAction(xxxx)
node…
this.xxxxx

楼主说的类似这种情况吧 await之后的所有执行

1赞

哦,那我理解错了,我以为回调的情况呢

习惯加就好了

用装饰器呀,比如你定制一个函数的装饰器,这个装饰器可以看作是对函数功能拓展,比如你说的安全性校验,就可以放到装饰器内
function promise_function(_: any, __: string, descriptor: PropertyDescriptor) {
const original = descriptor.value;

descriptor.value = async function (...args: any[]) {
    // 执行前节点校验
    if (!cc.isValid(this.node)) {
        cc.warn(`[promise_function] node invalid before executing ${original.name}`);
        return;
    }

    try {
        const result = await original.apply(this, args);

        // 执行后再校验一次
        if (!cc.isValid(this.node)) {
            cc.warn(`[promise_function] node invalid after executing ${original.name}`);
            return;
        }

        return result;
    } catch (err) {
        cc.error(`[promise_function] error in ${original.name}:`, err);
    }
};

return descriptor;

}

假设function1 是一个await,
@promise_function
async function1 () {
const res = await this.fakeAsyncLoad();
this.node.setPosition(cc.v3(0, 0, 0)); // 如果 node 已经被销毁,就不会走到这里
} 在项目中,我是这么使用的

2赞