作者:opple 时间:2022-12-04 阅读:()
setTimeout(function() {
console.log("执行第一个Promise, 500ms");
resolve("第一个执行完毕");
}, 500);
})
return result;
}
private secPromise(): Promise {
let result = new Promise((resolve, reject)=> {
setTimeout(function() {
console.log("执行第二个Promise, 300ms");
resolve("第二个执行完毕")
}, 300);
})
return result;
}
private thirdPromise(): Promise {
let result = new Promise((resolve, reject)=> {
setTimeout(function() {
console.log("执行第三个Promise, 200ms");
resolve("第三个执行完毕")
}, 200);
})
return result;
4、reject的用法
到这里大家应该对Promise有了大概的认知,前面笔者只介绍了resolve的用法,还没有介绍reject的用法,下面通过一个简单的例子来捕捉失败的回调:
private rejectPromise(): Promise {
let result = new Promise((resolve, reject)=> {
let math: number = Math.floor(Math.random() .10);
if(math >= 5) {
resolve("随机数大于5: " + math);
} else {
reject("随机数小于5");
}
})
return result;
}
调用 rejectPromise方法
this.rejectPromise().then( //reject的用法
(data)=> {
console.log(data);
},
(data)=> {
console.log(data);
}
)
上面这段代码,随机数如果大于5代表成功了,反而代表失败了执行reject方法,运行结果有两种:
5、all的用法
Promise的 all 提供并行执行异步操作的能力,并且在所有异步操作执行完毕之后才执行回调。依旧使用上面第一的三个方法,all用法如下:
// -------------all用法---------------
Promise.all([this.firPromise(), this.secPromise(), this.thirdPromise()])
.then((datas)=> {
console.log(datas);
})
// -------------all用法---------------
运行结果:
all方法并行执行三个Promise对象,并把所有异步执行的结果放进一个数组中传递给then,就是上面的datas。
6、在实际开发中的用法
先看一个在Egret上常用的方法getResByUrl的使用:
RES.getResByUrl("resource/assets/egret_icon.png", (data)=> {
let icon: egret.Bitmap = new egret.Bitmap(data);
this.addChild(icon);
}, this, RES.ResourceItem.TYPE_IMAGE);
API中:
function getResByUrl(url: string, compFunc?: Function, thisObject?: any, type?: string): Promise;
可以看到getResByUrl 加载一个路径的图片资源,加载完成后执行comFunc回调函数,通过回调函数加载此图片资源,显示出来。我们可以拆分一下这个步骤,如下:
private urlGetImg() {
let result: Promise = RES.getResByUrl("resource/assets/egret_icon.png");
result.then((data)=> {
let icon: egret.Bitmap = new egret.Bitmap(data);
icon.x = egret.MainContext.instance.stage.stageWidth - icon.width;
this.addChild(icon);
})
}
二者结果相同,都可以通过路径把图片加载出来。
下面另外一个例子,参考Nasus
创建5 .5个对象,异步依次执行一系列操作,效果如下图。
本次所有行为执行完毕之后,才可以进入下一次操作。使用到tween第三方库,源码如下:
private orderTW() {
for (let i = 0; i < 5; i++) {
for (let j = 0; j < 5; j++) {
let map: egret.Bitmap = new egret.Bitmap(RES.getRes("egret_icon_png"));
map.anchorOffsetX = map.width / 2;
map.anchorOffsetY = map.height / 2;
map.x = map.width .j;
map.y = map.height .i;
this._layer.addChild(map);
this._layer.x = egret.MainContext.instance.stage.stageWidth / 2 - this._layer.width / 2;
this._layer.y = egret.MainContext.instance.stage.stageHeight / 2 - this._layer.height / 2;
}
}
//当前下标
let index: number = 0;
//执行动作的Promise
let twPromise = () => {
显示全部
收起