emitter.emit 中传递 arraybuffer 失败 HarmonyOS 鸿蒙Next

emitter.emit 中传递 arraybuffer 失败 HarmonyOS 鸿蒙Next

let eventData: emitter.EventData = {
  data: {
    buffer,
    // width,
    // height,
  }
};

console.log("eventData type:", eventData instanceof Object);
emitter.emit("getFrameInfo", eventData);

传递buffer在emitter.on里面收到就是{},如果不传递buffer,就能拿到width height,请问这是为什么呢


更多关于emitter.emit 中传递 arraybuffer 失败 HarmonyOS 鸿蒙Next的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

你好,ArrayBuffer类型的数据需要转换为Base64编码后再进行传输。

更多关于emitter.emit 中传递 arraybuffer 失败 HarmonyOS 鸿蒙Next的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,emitter.emit用于在事件总线中传递数据。如果你在传递ArrayBuffer时遇到失败,可能是因为鸿蒙的事件总线机制对数据类型有特定的限制。emitter.emit通常支持传递基本数据类型(如字符串、数字、布尔值)以及简单的对象,但对于二进制数据(如ArrayBuffer),可能需要额外的处理。

你可以考虑将ArrayBuffer转换为Base64编码的字符串后再传递。例如:

const buffer = new ArrayBuffer(10);
const base64String = btoa(String.fromCharCode.apply(null, new Uint8Array(buffer)));
emitter.emit('eventName', base64String);

在接收端,再将Base64字符串解码回ArrayBuffer

const base64String = event.data;
const binaryString = atob(base64String);
const buffer = new ArrayBuffer(binaryString.length);
const uint8Array = new Uint8Array(buffer);
for (let i = 0; i < binaryString.length; i++) {
    uint8Array[i] = binaryString.charCodeAt(i);
}

这种方式可以绕过事件总线对二进制数据的限制。

回到顶部