- //异步调用,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("执行完成。");
- }
复制代码
|