TypeScript之异步函数
admin
2023-07-27 21:40:06
0

必须搞清楚 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{
            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秒`);
        }

    }
}

结果 :
TypeScript之异步函数

解释 : setTimeOut是异步的

二 :
TypeScript之异步函数

因为 : await 关键字 , 是等待 this.timeout()的结果 , 他是永远等不到的 , 所以程序卡死

结果:
TypeScript之异步函数

这个和 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.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 );
            }
        }

相关内容

热门资讯

浙江宣传:“走个面儿”咋就没面... “咱北京两千多万人口,您受累,您走个面儿,把这第一波的票房带起来,咱就有了。”某知名导演的新片首映礼...
辞职声明仅95秒遭质疑,韩国队... 【环球时报综合报道】美加墨世界杯小组赛出局后,韩国队主教练洪明甫当地时间28日在墨西哥的韩国队大本营...
美媒爆料:美军第五舰队总部遭伊... 据美国《华尔街日报》27日报道,其通过对卫星图像、社交媒体视频和五角大楼记录的分析发现,今年2月底至...
英国智库给菲律宾GDP增速“浇... 【环球时报特约记者 叶满】英国经济研究机构凯投宏观发布的最新一期《亚洲经济展望》报告(以下简称“报告...
欧洲持续高温,有华人用冰箱降温... 连日来,欧洲多国迎来罕见极端高温天气,法国、德国、意大利等地气温持续飙升,部分地区突破40摄氏度。受...
伊副外长强调船只须按“伊朗线路... 伊朗外交部副部长加里巴巴迪当地时间29日晚间在接受采访时强调,所有船只均须按照“伊朗线路”通过霍尔木...
委内瑞拉强震已致1719人死亡 当地时间29日,委内瑞拉全国代表大会主席罗德里格斯通报,地震已造成该国1719人死亡,5034人受伤...
铋晟新材料申请氯氧化铋基复合材... 国家知识产权局信息显示,江苏铋晟新材料有限公司申请一项名为“一种氯氧化铋基复合材料及其制备方法和用途...
韩国政府将投资千万亿韩元于AI... 韩国总统李在明29日在总统府青瓦台主持召开会议,公布总额超千万亿韩元的半导体、物理人工智能(AI)和...
以色列防长称以伊可能随时再起冲... △卡茨(资料图)据以色列方面29日消息,以国防部长卡茨当天表示,鉴于复杂的安全局势和在黎巴嫩的军事行...