当前位置: 首页 > 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.jsqmd.com/news/939273/

相关文章:

  • 国内工业级3D打印代加工服务商实测排行 - 优质品牌商家
  • Windows宝塔面板启动卡死?别急着重装,先试试这个服务修复大法
  • 双系统党必看:Ubuntu 18.04下Windows 10启动盘制作与bootmgfw.efi丢失修复全记录
  • QRemeshify:基于QuadWild算法的Blender四边形重拓扑技术深度解析
  • HarmonyOS 拉起系统浏览器与短信界面:WantUtil.toWebBrowser 与 startMMS 实战
  • 请结合以下说明,先完成类似python的内置函数。 然后再去完成内置库(标准款) ‌内置函数‌
  • 2026年6月安庆黄金回收白银回收铂金回收权威排行榜TOP5:纯金+金条+银条+钯金 门店地址联系方式推荐
  • 基于Arduino Uno与七段数码管的简易任务计数器设计与实现
  • 2026数字展厅设计技术干货:数字孪生沙盘、数字孪生钢厂、数字展厅、数字沙盘、虚拟展厅、设备数字孪生、360全息柜选择指南 - 优质品牌商家
  • 多设备组网与Mesh网络入门
  • 从新手到高手:Smithbox游戏修改工具完全指南 [特殊字符]
  • 2026年更新:浙江生产线定制厂家选型指南与趋势洞察 - 2026年企业资讯
  • 仿真绿植绿化技术核心要点及服务商选择参考推荐:仿真绿植绿化工程/仿真绿植绿化电话/四川仿真绿植绿化/优选指南 - 优质品牌商家
  • Claude Code使用教程(vibe coding) 二
  • GlosSI 入门指南:让 Steam 控制器在任意游戏和应用中畅玩
  • 四川智慧垃圾箱厂家排行:四川楼顶发光字/四川民宿集装箱/四川苹果舱/四川钢结构仿木屋/合规性与服务能力实测对比 - 优质品牌商家
  • 2026年近期如何筛选靠谱的气力输送设备优质厂家:以天顺机械为例的专业解析 - 2026年企业资讯
  • Agent的四种执行模式,解锁人机协作新境界!
  • 如何快速部署HS2-HF Patch:解锁Honey Select 2完整游戏体验的终极指南
  • 别再死记硬背了!用Python手撸一个ID3决策树,从熵到分类器一次搞懂
  • 专为食品进出口打造的外贸ERP!智能生成发票、质检报告高效合规
  • 动手实验:用Python和Mininet验证TCP Cubic/BBR的Jain公平性指数
  • win11中启用经典win10右键菜单和还原默认win11右键菜单如何操作
  • 分立元件无稳态多谐振荡器:用晶体管与RC电路实现LED交替闪烁
  • 告别编译噩梦:我在Ubuntu 18.04/20.04上为Xenomai 3.2.1打Linux 5.10.76补丁的五个关键抉择
  • 2026年当下,迪庆好的学校保洁机构如何选?腾兴物业深度解析 - 2026年企业资讯
  • 【判断正负】信息学奥赛一本通C语言解法(题号1039)
  • ## 2026深圳全屋定制实测:西丽自有工厂木点点ENF套餐到底值不值? - 产品测评官
  • VoiceFixer语音修复工具:3种模式一键解决噪音、失真和低质量音频问题
  • 四川地坪工程技术解析及2026年主流服务商盘点:宜宾彩色epdm颗粒供货商公司/宜宾彩色艺术地坪公司/实力盘点 - 优质品牌商家