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