HarmonyOS ArkTS 判断 Promise 与异步函数的正确姿势:TypeUtil 实战教程

发布时间:2026/6/3 1:33:03

HarmonyOS ArkTS 判断 Promise 与异步函数的正确姿势:TypeUtil 实战教程 文章目录背景方法总览isPromise — 判断是否是 PromiseisAsyncFunction — 判断是否是异步函数isNativeError — 判断是否是原生 Error 对象组合使用处理不确定类型的函数参数所有 TypeUtil 方法速查表写在最后背景近期发现一款很有意思的HarmonyOS 三方库, 地址 pura/harmony-utils(V1.4.0) , 作者是桃花镇童长老, 我这里也是直接通过该作者公布的源码进行案例编写进行,写了到目前写了一部分demo ,感觉确实很有帮助,这里呢也是开始写一个系列的演示demo 供大家参考。如有帮助可以在OpenHarmony中进行下载安装进行使用哦案例demo导航展示↓↓↓↓↓↓接下来言归正传 ↓↓↓↓异步编程是现代应用开发的核心ArkTS 里async/await和Promise用得相当频繁。但有时候你拿到一个值需要判断它是不是 Promise或者拿到一个函数引用不知道它是不是 async 函数——这时候 TypeUtil 的isPromise和isAsyncFunction就派上用场了。方法总览isPromise — 判断是否是 Promisethis.Btn(isPromise(Promise.resolve()) → true,#8E44AD,(){constpPromise.resolve(1);this.addLog(isPromise(Promise.resolve()) →${TypeUtil.isPromise(p)});})运行结果isPromise(Promise.resolve()) → truePromise.resolve(1)返回的就是一个 Promise 对象isPromise返回true。什么时候用写通用 SDK 或框架代码时参数可能是普通值也可能是 Promise需要做分支处理functionprocessResult(result:number|Promisenumber){if(TypeUtil.isPromise(result)){// 是 Promise等待结果result.then(value{console.log(异步结果:,value);});}else{// 是普通值直接处理console.log(同步结果:,result);}}isAsyncFunction — 判断是否是异步函数// async 函数返回 truethis.Btn(isAsyncFunction(async (){}) → true,#6C3483,(){constfnasync(){};this.addLog(isAsyncFunction(async (){}) →${TypeUtil.isAsyncFunction(fn)});})// 普通函数返回 falsethis.Btn(isAsyncFunction((){}) → false,#6C3483,(){constfn(){};this.addLog(isAsyncFunction((){}) →${TypeUtil.isAsyncFunction(fn)});})运行结果isAsyncFunction(async (){}) → true isAsyncFunction((){}) → falseasync () {}是异步函数返回true普通箭头函数() {}返回false。理解 async 函数的本质async函数调用后永远返回一个 Promise即使函数体里没有awaitconstfnasync()42;constresultfn();// result 是 Promisenumber不是 42TypeUtil.isPromise(result);// → trueTypeUtil.isAsyncFunction(fn);// → true所以isAsyncFunction的意义在于在函数被调用之前提前判断它是不是异步的方便做统一的异步处理逻辑。实际使用场景插件系统或回调框架里支持用户传入同步或异步的回调函数asyncfunctionrunCallback(callback:Function){if(TypeUtil.isAsyncFunction(callback)){// 是异步函数await 等待awaitcallback();}else{// 是同步函数直接调用callback();}}isNativeError — 判断是否是原生 Error 对象this.Btn(isNativeError(new Error(err)) → true,#C0392B,(){this.addLog(isNativeError(new Error()) →${TypeUtil.isNativeError(newError(err))});})this.Btn(isNativeError(string) → false,#C0392B,(){this.addLog(isNativeError(string) →${TypeUtil.isNativeError(string)});})运行结果isNativeError(new Error()) → true isNativeError(string) → false为什么需要这个HarmonyOS以及 JavaScript 标准中catch捕获的值类型不确定try{// 某些代码}catch(e){// e 的类型是 unknown// 可能是 Error 对象// 也可能是字符串 throw error message// 还可能是数字 throw 404}用isNativeError可以精确判断try{someDangerousOperation();}catch(e){if(TypeUtil.isNativeError(e)){// 是 Error 对象可以安全访问 .message、.stackconsole.log(Error:,(easError).message);console.log(Stack:,(easError).stack);}else{// 不是标准 Error可能是字符串等console.log(Unknown error:,e);}}组合使用处理不确定类型的函数参数下面是一个综合运用的例子——处理一个可能是值、Promise、或者函数的参数asyncfunctionresolveValue(input:number|Promisenumber|(()number)|(()Promisenumber)):Promisenumber{if(TypeUtil.isPromise(input)){// 已经是 Promisereturnawaitinput;}elseif(TypeUtil.isAsyncFunction(input)){// 是异步函数调用并等待returnawait(inputas()Promisenumber)();}elseif(TypeUtil.isFunction(input)){// 是同步函数直接调用return(inputas()number)();}else{// 是普通值returninputasnumber;}}所有 TypeUtil 方法速查表到这里把 TypeUtil 的主要方法都覆盖了汇总一下基础类型方法检测目标isBoolean布尔值isNumber数字isString字符串isObject纯对象isArray数组isFunction函数isResourceHarmonyOS ResourceisResourceStrstring 或 Resource容器类型方法检测目标isMapMapisWeakMapWeakMapisSetSetisWeakSetWeakSet特殊对象方法检测目标isDateDate 对象isRegExp正则表达式isDataViewDataViewisArrayBufferArrayBufferisAnyArrayBufferArrayBuffer/SharedArrayBufferisTypedArray任意 TypedArrayisUint8Array等具体 TypedArray异步/函数方法检测目标isPromisePromise 对象isAsyncFunctionasync 函数isNativeErrorError 对象写在最后isPromise和isAsyncFunction是异步编程里的好帮手特别是在写框架、SDK、或者通用工具函数时需要对参数类型做分支处理的场景非常多。isNativeError也建议养成习惯在catch块里用它检查一下写出更健壮的错误处理代码。

相关新闻