HarmonyOS鸿蒙Next中自定义接口回调为何会如此麻烦,这样设计的初衷在哪里?

HarmonyOS鸿蒙Next中自定义接口回调为何会如此麻烦,这样设计的初衷在哪里?

背景:自定义接口回调需要实现回调的对象

问题:

  • 有没有替换方案?
  • 这样设计的目的是什么?

举例:以下是实现的代码,如果 UserOption 中 有 N 次调用 并且每次的回调都需要单独处理 我就需要实现 N 个 MyCallBack

在java中 可以直接 new BaseCallBack{ onSuccess(){}, onError(){} }
在TS 中 也可以直接 { onSuccess(){}, onError(){} }

综上所诉,在ArkTs中实现接口回调是相对麻烦的,那么类似的场景是否有平替方案呢?这样设计的目的是什么或者说这样设计想要解决什么问题?

实现方法一:

/**
 * 回调的接口
 */
export interface BaseCallBack {
  onSuccess(): void
  onError(): void
}

/**
 * 工具类
 */
export class BaseUtil {
  static Option(params: string, callBack: BaseCallBack) {
    params += '执行Option 完成'
    callBack.onSuccess()
  }
}

/**
 * 调用方
 */
export function UserOption() {
  BaseUtil.Option('张三', new MyCallBack())
  BaseUtil.Option('李四', new MyCallBack2())
  ......
  ......
  ......
  ......
  ......
}

/**
 * 调用方实现的接口实体对象
 */
export class MyCallBack implements BaseCallBack{
  onSuccess(): void {
    // 执行操作1...
  }

  onError(): void {
    // 执行操作1...
  }
}

export class MyCallBack2 implements BaseCallBack{
  onSuccess(): void {
    // 执行操作2...
  }

  onError(): void {
    // 执行操作2...
  }
}

实现方法二: 这样写的问题在于 我调用方可能只关心成功状态,但是我还需要实现错误的回调,很死板

/**
 * 工具类
 */
export class BaseUtil {
  static Option(params: string, onSuccess:() => void, onError:() => void) {
    params += '执行Option 完成'
    if (params.length == 1) {
      onSuccess()
    } else{
      onError()
    }
  }
}

/**
 * 调用方
 */
export function UserOption() {
  BaseUtil.Option('张三', () => {
    // success ......
  }, () => {
    // error ......
  })
  BaseUtil.Option('李四', () => {
    // success ......
  }, () => {
    // error ......
  })
}

更多关于HarmonyOS鸿蒙Next中自定义接口回调为何会如此麻烦,这样设计的初衷在哪里?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

6 回复

没太懂你想表达什么意思,你为啥不用promise呢?BaseUtil的Option方法直接返回一个promise不就行了,

更多关于HarmonyOS鸿蒙Next中自定义接口回调为何会如此麻烦,这样设计的初衷在哪里?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


我理解你说的意思,但是 promise 返回的是一个实体对象,我希望返回的是一个方法,这里有冲突,

再有一个 promise 返回 是异步的写法 如果是同步的需求就不能用了,

项目名称

摘要

  • 项目状态 : 已完成
  • 创建时间 : 2023-02-15
  • 更新时间 : 2023-02-16

描述

项目描述内容。

标签

  • 标签一
  • 标签二
  • 标签三

目标

  • 完成项目目标一
  • 完成项目目标二
  • 完成项目目标三

要求

  • 需求一
  • 需求二
  • 需求三

鸿蒙Next中接口回调采用更严格的类型安全和模块化设计,主要基于以下考量:

  1. 确保跨设备通信的可靠性,回调需明确声明数据流转路径;
  2. 适配分布式架构,回调参数必须支持序列化/反序列化;
  3. 遵循ArkTS的静态类型检查规则,避免运行时错误。

设计上强制开发者显式处理生命周期和线程安全,通过@Callback装饰器规范异步行为。这种约束性设计提升了分布式场景下的接口稳定性。

关于HarmonyOS Next中接口回调的设计,这种实现方式主要是为了确保类型安全和代码可维护性。ArkTS作为强类型语言,要求显式实现接口可以带来以下优势:

  1. 类型检查更严格,能在编译期发现错误
  2. 代码结构更清晰,回调逻辑集中管理
  3. 便于IDE进行智能提示和重构

替代方案建议:

  1. 可以使用可选参数设计回调接口,将onError设为可选
  2. 对于简单场景,可以使用匿名类简化写法:
    BaseUtil.Option('张三', new class implements BaseCallBack {
      onSuccess() { /* 处理逻辑 */ }
      onError() {} // 留空实现
    })
    

这种设计虽然略显繁琐,但能更好地适应大型应用开发,保证代码质量。对于简单回调,后续版本可能会提供更简洁的语法糖支持。

回到顶部