You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

erdjs的ExtensionProvider发交易后扩展窗口无法自动关闭,如何参考xExchange实现?

实现逻辑拆解

xExchange的自动关窗逻辑没有完全依赖ExtensionProvider.sendTransaction()的原生Promise返回,而是拆分了签名请求提交、结果监听两个独立流程,核心实现步骤如下:

  • 提前注册钱包扩展的跨页消息监听
    MultiversX钱包扩展在交易完成签名、提交到链上节点后,会主动向当前网页上下文发送postMessage事件,事件内包含交易hash、签名结果等完整信息,不需要等待sendTransaction的Promise返回就能拿到成功结果。
  • 调用sendTransaction后不阻塞等待Promise resolve,并行处理两个分支
    • 收到扩展推送的交易成功事件后,直接调用扩展暴露的close()方法主动关闭签名窗口,同时执行后续的交易确认逻辑,不需要等30秒超时
    • 给sendTransaction的Promise追加catch回调,捕获Extension window was closed without response类型的错误,识别到是用户主动关窗后直接终止等待流程,抛出可控的业务错误,不会阻塞后续交互
  • 自定义覆盖ExtensionProvider的默认超时逻辑
    默认ExtensionProvider的超时时间是30秒,可以在初始化Provider的时候修改超时配置,或者自己封装一层代理逻辑,收到成功事件后直接处理pending状态的sendTransaction Promise,避免长时间挂起。
最小实现示例
import { ExtensionProvider } from "@multiversx/sdk-extension-provider";

// 初始化provider
const provider = ExtensionProvider.getInstance();
await provider.init();

// 注册扩展消息监听
window.addEventListener("message", (event) => {
  // 过滤非钱包扩展的消息
  if (event.data?.type !== "multiversx_extension_response" || !event.data?.data?.transactionHash) {
    return;
  }
  // 拿到交易hash后主动关闭扩展窗口
  provider.close();
  // 执行你的交易后续处理逻辑,比如查询交易上链状态
  handleTransactionSuccess(event.data.data.transactionHash);
});

try {
  // 调用sendTransaction,不需要await等待返回
  const txPromise = provider.sendTransaction(yourTransactionObject);
  // 捕获主动关窗的错误,避免控制台报错
  txPromise.catch((err) => {
    if (err.message.includes("Extension window was closed without response")) {
      // 用户主动关窗,走业务错误逻辑
      handleUserCanceled();
      return;
    }
    // 其他错误正常抛出
    throw err;
  });
} catch (e) {
  console.error("交易发起失败", e);
}

内容的提问来源于stack exchange,提问作者Kali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 07:36:05