由于TS中没有线程睡眠typescript 虚函数,所以我提供以下测试方法
一:正常
module demo{
export class AsyncDemo{
private _sentry : number = 0;
public start() : void{
this.getSomething("Aonaufly").then(
$value=>{
egret.log(`执行成功 ! name : ${$value}`);
},
$error=>{
egret.log(`执行失败 ! error : ${$error}`);
}
);
}
private timeout() : number{
while( this._sentry == 0 ){
if( this._sentry != 0 ){
break;
}
}
return egret.setTimeout(
this.handler_timeout,
this,
2500
);
}
/**
* 测试异步回调函数
* @param {string} $name
*/
private async getSomething( $name : string ) : Promise{
egret.log(`开始执行异步函数`);
this._sentry = 1;
const $id = await this.timeout();
egret.log(`timeout 执行完毕! timeid : ${$id}`);
return $name;
}
private handler_timeout() : void {
egret.log(`执行了等待 2.5秒`);
}
}
}
结果:
说明:setTimeOut是异步的
二:
因为:await关键字在等待this.timeout()的结果,永远不会等待,所以程序卡住了
结果:
这和C#是一样的,只不过C#容易测试,因为C#有线程的概念!!!
其他补充:
以下是使用 Promomise 的三个示例
第一种情况使用newPromisetypescript 虚函数,凸显promise实现的异步机制
2和3使用Promise.resolve
第三种情况,参数通过then传递给下一个then
复制并运行代码,你会听到promise的奥秘
//new Promise() vs Promise.resolve()
//then 方法每次都会返回 promise实例对象
function newPromise_resolve() {
return new Promise((resolve,reject) => {
resolve(); //这里调resolve方法,则then方法会被调用
console.log('resolve里面的log');
})
//先输出 resolve里面的log
//后输出 then方法
//这里很好地体现了 Promise实现了 node.js的异步机制
}
newPromise_resolve().then(() => {
console.log('then方法');
});
newPromise_resolve();
//使用Promise.resolve
function promise_resolve() {
let promise = Promise.resolve();
promise
.then(() => {
console.log('promise_resolve1');
})
.then(() => {
console.log('promise_resolve2');
});
return promise;
}
//promise_resolve();
function promise_forEach_then() {
let ids = [1,2,3];
let promise = Promise.resolve();
ids.forEach((id) => {
promise
.then(() => {
return {id}
})
.then(consoleLogId)
});
}
function consoleLogId(id) {
console.log('promise_forEach_then---' + id);
}
//promise_forEach_then();
///////////////////////////////////////////////////////////////////////
public deatoryGroupRes( $groupName : string ) : Promise{
if( this._hashmap.containsKey( $groupName ) == true ){
if( this._is_loading == true && $groupName == this._cur_group ){
return new Promise((resolve,reject) : void=>{
resolve(false);
reject(false);
});
}else{
this._hashmap.remove( $groupName );
return RES.destroyRes( $groupName );
}
}else{
return RES.destroyRes( $groupName );
}
}
发表评论