TypeScript之异步函数
必须搞清楚 setTimeout 为异步函数.
因为 : TS中没有线程休眠 , 所以我提供了如下测试方式
一 : 正常
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<string>{ 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#有线程的概念!!!
其他补充 : https://blog.csdn.net/rcjjian/article/details/72831577下面有三个使用到Prmomise的例子
第1个例子 使用 new Promise,体现了 promise实现异步机制
2和3 使用 Promise.resolve
第3个例子,通过 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.resolvefunction 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<boolean>{ 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 ); } }
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。