当前位置: 首页 > news >正文

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

文章目录

    • 背景
      • 方法总览
      • isPromise — 判断是否是 Promise
      • isAsyncFunction — 判断是否是异步函数
      • isNativeError — 判断是否是原生 Error 对象
      • 组合使用:处理不确定类型的函数参数
      • 所有 TypeUtil 方法速查表
      • 写在最后

背景

近期发现一款很有意思的HarmonyOS 三方库, 地址 @pura/harmony-utils(V1.4.0) , 作者是"桃花镇童长老", 我这里也是直接通过该作者公布的源码进行案例编写进行,写了到目前写了一部分demo ,感觉确实很有帮助,这里呢也是开始写一个系列的演示demo 供大家参考。如有帮助可以在OpenHarmony中进行下载安装进行使用哦

案例demo导航展示

↓↓↓↓↓↓接下来言归正传 ↓↓↓↓

异步编程是现代应用开发的核心,ArkTS 里async/awaitPromise用得相当频繁。

但有时候你拿到一个值,需要判断它是不是 Promise;或者拿到一个函数引用,不知道它是不是 async 函数——这时候 TypeUtil 的isPromiseisAsyncFunction就派上用场了。

方法总览

isPromise — 判断是否是 Promise

this.Btn('isPromise(Promise.resolve()) → true','#8E44AD',()=>{constp=Promise.resolve(1);this.addLog(`isPromise(Promise.resolve()) →${TypeUtil.isPromise(p)}`);})

运行结果:

isPromise(Promise.resolve()) → true

Promise.resolve(1)返回的就是一个 Promise 对象,isPromise返回true

什么时候用?

写通用 SDK 或框架代码时,参数可能是普通值也可能是 Promise,需要做分支处理:

functionprocessResult(result:number|Promise<number>){if(TypeUtil.isPromise(result)){// 是 Promise,等待结果result.then(value=>{console.log('异步结果:',value);});}else{// 是普通值,直接处理console.log('同步结果:',result);}}

isAsyncFunction — 判断是否是异步函数

// async 函数返回 truethis.Btn('isAsyncFunction(async ()=>{}) → true','#6C3483',()=>{constfn=async()=>{};this.addLog(`isAsyncFunction(async ()=>{}) →${TypeUtil.isAsyncFunction(fn)}`);})// 普通函数返回 falsethis.Btn('isAsyncFunction(()=>{}) → false','#6C3483',()=>{constfn=()=>{};this.addLog(`isAsyncFunction(()=>{}) →${TypeUtil.isAsyncFunction(fn)}`);})

运行结果:

isAsyncFunction(async ()=>{}) → true isAsyncFunction(()=>{}) → false

async () => {}是异步函数,返回true;普通箭头函数() => {}返回false

理解 async 函数的本质:

async函数调用后永远返回一个 Promise,即使函数体里没有await

constfn=async()=>42;constresult=fn();// result 是 Promise<number>,不是 42!TypeUtil.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|Promise<number>|(()=>number)|(()=>Promise<number>)):Promise<number>{if(TypeUtil.isPromise(input)){// 已经是 Promisereturnawaitinput;}elseif(TypeUtil.isAsyncFunction(input)){// 是异步函数,调用并等待returnawait(inputas()=>Promise<number>)();}elseif(TypeUtil.isFunction(input)){// 是同步函数,直接调用return(inputas()=>number)();}else{// 是普通值returninputasnumber;}}

所有 TypeUtil 方法速查表

到这里把 TypeUtil 的主要方法都覆盖了,汇总一下:

基础类型:

方法检测目标
isBoolean布尔值
isNumber数字
isString字符串
isObject纯对象
isArray数组
isFunction函数
isResourceHarmonyOS Resource
isResourceStrstring 或 Resource

容器类型:

方法检测目标
isMapMap
isWeakMapWeakMap
isSetSet
isWeakSetWeakSet

特殊对象:

方法检测目标
isDateDate 对象
isRegExp正则表达式
isDataViewDataView
isArrayBufferArrayBuffer
isAnyArrayBufferArrayBuffer/SharedArrayBuffer
isTypedArray任意 TypedArray
isUint8Array具体 TypedArray

异步/函数:

方法检测目标
isPromisePromise 对象
isAsyncFunctionasync 函数
isNativeErrorError 对象

写在最后

isPromiseisAsyncFunction是异步编程里的好帮手,特别是在写框架、SDK、或者通用工具函数时,需要对参数类型做分支处理的场景非常多。

isNativeError也建议养成习惯,在catch块里用它检查一下,写出更健壮的错误处理代码。

http://www.gsyq.cn/news/1450677.html

相关文章:

  • 国内工业级3D打印代加工服务商实测排行 - 优质品牌商家
  • 底轴旋转坝技术深度解析:钢坝、钢闸门、防洪闸、合页坝、底轴旋转坝、弧形闸门、拦河坝、景观坝、智能一体化闸门、气动浮体坝选择指南 - 优质品牌商家
  • 请结合以下说明,先完成类似python的内置函数。 然后再去完成内置库(标准款) ‌内置函数‌
  • 2026年6月安庆黄金回收白银回收铂金回收权威排行榜TOP5:纯金+金条+银条+钯金 门店地址联系方式推荐
  • 2026数字展厅设计技术干货:数字孪生沙盘、数字孪生钢厂、数字展厅、数字沙盘、虚拟展厅、设备数字孪生、360全息柜选择指南 - 优质品牌商家
  • HarmonyOS 拉起系统浏览器与短信界面:WantUtil.toWebBrowser 与 startMMS 实战
  • 2026年更新:浙江生产线定制厂家选型指南与趋势洞察 - 2026年企业资讯
  • Agent的四种执行模式,解锁人机协作新境界!
  • 如何快速部署HS2-HF Patch:解锁Honey Select 2完整游戏体验的终极指南
  • 动手实验:用Python和Mininet验证TCP Cubic/BBR的Jain公平性指数
  • win11中启用经典win10右键菜单和还原默认win11右键菜单如何操作
  • 【判断正负】信息学奥赛一本通C语言解法(题号1039)
  • 2026年当下,迪庆好的学校保洁机构如何选?腾兴物业深度解析 - 2026年企业资讯
  • 四川地坪工程技术解析及2026年主流服务商盘点:宜宾彩色epdm颗粒供货商公司/宜宾彩色艺术地坪公司/实力盘点 - 优质品牌商家
  • 【算法分析与设计】第36篇:计算几何基础:凸包问题的分治与扫描线解法
  • ESET-KeyGen终极指南:5分钟掌握ESET安全软件免费试用激活技巧
  • 2026冲刺用!AI论文网站测评:最新推荐与实用对比
  • 2026年物流仓配系统品牌TOP5排行及选型参考 - 优质品牌商家
  • 51单片机驱动直流电机+LabVIEW实时监控调速实操资源包
  • 第三方实测测评:极客速达海外一件代发,中小跨境卖家优选供应链服务商 - 星际AI
  • 从VR到裸眼3D:用UE5 SpatialLabs插件开发,你需要绕开哪些‘思维定式’?
  • 做AI编码开发,我终于戒掉“显卡算力焦虑”:弃RTX5060选M4 Mac Mini实录
  • 2026年q2仓配管理软件品牌评测:仓储配送管理系统/仓库智能管理系统/仓库订单管理系统/从场景到实效的选型参考 - 优质品牌商家
  • Java基础:Math工具类全方位详解
  • 防火墙为什么能根据 IP 地址过滤?IP 不是会变的吗?
  • 自指螺旋与电子内禀自旋的对应关系推导(世毫九实验室原创研究)
  • 如何用Python自动化抢票神器告别演唱会门票秒光烦恼
  • Prompt调优避坑手册,为什么你写的总差点意思
  • QKeyMapper终极指南:5分钟掌握Windows最强免费按键映射工具
  • 大模型预训练数据工程中针对 Milvus向量数据库分区分片设计 低质量文本的启发式过滤算法优化路径