首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用comlink抛出/捕获自定义错误。打字脚本

如何使用comlink抛出/捕获自定义错误。打字脚本
EN

Stack Overflow用户
提问于 2020-12-11 03:49:54
回答 1查看 205关注 0票数 2

在UI过程中,我希望捕获自定义错误,并在Webworker中添加comlink。

自定义错误是扩展错误,因此将序列化/反序列化组合成错误而不是自定义错误。

串行化

代码语言:javascript
运行
复制
if (value instanceof Error) {
  serialized = {
    isError: true,
    value: {
      message: value.message,
      name: value.name,
      stack: value.stack,
    },
  };
}

https://github.com/GoogleChromeLabs/comlink/blob/520e4d64072bc07c3c60dd67dd95910a23602445/src/comlink.ts#L248

反序列化

代码语言:javascript
运行
复制
if (serialized.isError) {
  throw Object.assign(
    new Error(serialized.value.message),
    serialized.value
  );
}

https://github.com/GoogleChromeLabs/comlink/blob/520e4d64072bc07c3c60dd67dd95910a23602445/src/comlink.ts#L265

我试图自定义throwTransferHandler以引发自定义错误,但它没有工作。因为throwMarker是唯一的符号,不导出。

代码语言:javascript
运行
复制
canHandle: (value): value is ThrownValue =>
  isObject(value) && throwMarker in value,

https://github.com/GoogleChromeLabs/comlink/blob/520e4d64072bc07c3c60dd67dd95910a23602445/src/comlink.ts#L245

EN

回答 1

Stack Overflow用户

发布于 2022-06-20 13:37:56

最后,我定义了本地模块,该模块重新导出comlink并使用序列化错误作为自定义错误序列化/反序列化。

代码语言:javascript
运行
复制
import * as Comlink from "comlink";
import ErrorCodec from "serialize-error";
export * from "comlink";

interface ThrownValue {
  value: unknown;
}
type SerializedThrownValue =
  | { isError: true; value: ErrorCodec.ErrorObject }
  | { isError: false; value: unknown };

const throwTransferHandler_:
  | Comlink.TransferHandler<unknown, unknown>
  | undefined = Comlink.transferHandlers.get("throw");

const throwTransferHandler = throwTransferHandler_ as Comlink.TransferHandler<
  ThrownValue,
  SerializedThrownValue
>;

const throwTransferHandlerCustom: Comlink.TransferHandler<
  ThrownValue,
  SerializedThrownValue
> = {
  canHandle: throwTransferHandler.canHandle,
  serialize: ({ value }) => {
    let serialized: SerializedThrownValue;
    if (value instanceof Error) {
      serialized = {
        isError: true,
        value: ErrorCodec.serializeError(value),
      };
    } else {
      serialized = { isError: false, value };
    }
    return [serialized, []];
  },
  deserialize: (serialized) => {
    if (serialized.isError) {
      const error = ErrorCodec.deserializeError(serialized.value);
      throw error;
    }
    throw serialized.value;
  },
};

Comlink.transferHandlers.set("throw", throwTransferHandlerCustom);

应该确保此版本的模块是在所有其他地方导入的,而不是直接的comlink导入。

作为canHandle的另一种选择,您还可以使用getOwnPropertySymbols和toString:

代码语言:javascript
运行
复制
Object.getOwnPropertySymbols({[Symbol("Comlink.thrown")]: 1})
  .some(_ => _.toString() === 'Symbol(Comlink.thrown)')
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65245540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档