关于TS 的 promise的同步执行

不好意思,本人creator入门外加 TS入门。我之前通过论坛搜索,学习了下通过TS的async和await来进行同步加载资源的方法。但是经过我自己的测试,这个方法好像也不能同步啊。因为这个await必须要放在async的方法里面。只是一个异步方法里面的进行同步,感觉他的作用只是让嵌套的回调写得整齐好看一点,没有真正达到主线程里面同步加载啊。请各位指教一下。

async init() {
let data = await this.loadResSync(xxx);
cc.log(“后执行”);
}

fun(){
this.init();
cc.log(“先执行”);
}

另外,我为什么想要同步加载呢,因为就是想让一些代码写起来简单啊,之前我用cocos2d+lua都是这么搞的,没啥性能问题啊。

1赞
        // 同步写法
        let prefab = my.loader.loadPrefab("prefab");
        if (prefab) {
            this.addChild(prefab);
        }
        
        // 异步写法
        cc.loader.loadRes("prefab", cc.Prefab, (err, prefab) => {
            if (err) {
                console.log(err);
                return;
            }
            let node = cc.instantiate(prefab);
            this.addChild(node);
        });

单从写法上,优势就已经很大了。更别说在更复杂的异步逻辑中控制调用顺序的问题了。

js 中现在没有办法使 promise 同步执行,async await 也只是 promise 语法糖而已,实际上这两个都和异步回调函数差不多,你想要的是阻塞嘛,但现在没有,如果只是想代码写起来简单点:
0.只能用 async await,这是最简单的
1.把所有异步操作都包装到一个地方,在某个地方提前于业务代码统一执行,不把 async 污染到你经常修改的业务代码,类似提前缓存

1赞

async init() {
let data = await this.loadResSync(xxx);
cc.log(“后执行”);
}
//以下改一下就可以理解成同步了,async/await 要把每个异步前加上await 就是同步
async fun(){
await this.init();
cc.log(“先执行”);
}

哦,感谢,之前一直以为自己的写法有问题。因为整个论坛的人都在说用这种方式同步加载。那结论就是没有, 至少我想要的那种加载方式没有。看来只能调整下代码习惯了,感觉复杂度提升不少啊。。

async/await 解决 Promise 链式调用问题, Promise 解决回调地狱问题

所有的回调都可以改成 async/await 及 promise的模式,
这个例子就是 回调变成 Promise, 再用async/await
function delay(time){
return new Promise((reslove, reject) => {
setTimeout(reslove, time)
})
}

async function test() {
await delay(1000)
}

不在异步里阻塞,整个程序不就全都卡住了嘛

其他语言在奋力发展协程,ts天生优势都不好好利用,async/await Promise.all不香么

请教下这样的写法优势在哪,不能是为了好看吧,还有在什么情况下使用呢,一直把握不精准,会造成滥用

用语法糖逃离多重回调嵌套导致代码可读性降低的问题,没必要捧上天。

同步加载地这段时间画面是完全卡住的状态,你是希望这种表现么

反了吧,回调地狱才是影响可读性的具体原因。

原话没加标点引起歧义了:joy:

最好能提供同步加载供我们选择,unity也是提供同步异步加载两种选择的。同步加载也不至于会导致很卡,自己把握好就行。

我打个比方,假设有这样一个场景:有一个选项列表,里面有很多选项,点击其中任意一个就会在场景中加载一个对应的prefab,点击其他选项会替换掉当前prefab,再次点击相同选项则移除当前prefab,每个prefab很小,可以瞬间完成加载。就这样一个需求,如果同步加载的,代码干净简单,基本不会出错,如果用异步的话,那就复杂多了。

我觉得异步用在场景切换,loading界面,这些情况下是无可代替的。其他情况异步未必好用。

unity支持多线程,而web worker现在的作用微乎其微,所以提供同步接口的意义不大,还可能造成程序崩溃