[TypeScript]async和await的使用

1,658 阅读1分钟
//异步调用,Promise代表一个异步操作,主要是封装回调
load(path: string) {
    return new Promise((resolve, rejects) => {
        resources.load(path, Prefab, (err: Error, data: Prefab) => {
            if (err) {
                // 失败,执行rejects函数,err.message是返回的错误信息。不会执行Promise.then
                rejects(err.message);
                //只要执行了rejects,后面哪怕调用到了resolve函数,也不会触发Promise.then
                //所以,return应该可以不加,但是为了代码的可读性,还是加下。
                return;
            }
            //成功,把data传送给Promise.then函数
            resolve(data);
        })
    })
}

//async要和await配套使用
//await表示强制等待状态。
//async表示函数是异步操作,不会阻塞执行逻辑。
//showWinAsync函数使用到了await,必须对该函数进行async标记。这就是async和await的配套使用。这样设计的目的应该是保证强制等待的操作不会阻塞其他操作。只是对Promise起效果。
async showWinAsync(path: string, action?: string, duration?: number) {
    
    //await后面要跟一个Promise对象,等Promise的异步操作执行完毕后,代码才会执行下去。
    await this.load(path).then((data: Prefab) => {
        if (data) {
            let parent = find("Canvas");
            if (parent == null) {
                warn("game error: \'Canvas/bg\' not exist!");
                return;
            }

            let winNode = instantiate(data);
            parent.addChild(winNode);
            winNode.setPosition(Vec3.ZERO);
        }
    })
    
    //有await,需要等load.then函数执行完毕,才会执行到这里。
    //没有await,则不会等待load.then函数的执行。
    log("执行完成。");
}