题目
维护一个老项目时,代码里混用了 sendAsync、send 与 request,并监听了 close、networkChanged、notification 等事件。请说明这些接口之间的关系,并给出迁移到 EIP-1193 新接口的方案。
考察目标
- 说清历史接口与事件名对应的新形态。
- 理解回调式接口与 Promise 接口在返回值处理上的差异。
- 能够识别老教程里的旧写法并制定替换清单。
对照 EIP-1193 附录中的历史接口与事件名,给出从旧 Provider API 迁移到 request/on/removeListener 的替换清单。
维护一个老项目时,代码里混用了 sendAsync、send 与 request,并监听了 close、networkChanged、notification 等事件。请说明这些接口之间的关系,并给出迁移到 EIP-1193 新接口的方案。
EIP-1193 把 sendAsync、send 等历史接口归入附录中的 Legacy Provider API:sendAsync 是回调式、接近 JSON-RPC 响应对象的接口,send 的行为在不同钱包之间并不统一,两者都已被 request 取代;历史事件 close、networkChanged、notification 分别由 disconnect、chainChanged、message 取代。新接口面是 request、on 与 removeListener。实现差异与工程取舍见深入回答。
【协议保证】sendAsync 采用回调式调用,回调收到的结果接近 JSON-RPC 响应对象(依据:EIP-1193 §Appendix III Legacy Provider API)。
【协议保证】send 的行为在不同钱包之间并不统一,历史上存在同步返回与回调返回等差异(依据:EIP-1193 §Appendix III Legacy Provider API)。
【协议保证】sendAsync 与 send 都属于历史接口,规范建议新代码使用 request 替代(依据:EIP-1193 §Appendix III Legacy Provider API、§request)。
【协议保证】历史事件 close 由 disconnect 取代(依据:EIP-1193 §Appendix III Legacy Provider API)。
【协议保证】历史事件 networkChanged 由 chainChanged 取代(依据:EIP-1193 §Appendix III Legacy Provider API)。
【协议保证】历史事件 notification 由 message 取代(依据:EIP-1193 §Appendix III Legacy Provider API)。
【协议保证】request 成功时 resolve 方法的结果值,而不是包含 jsonrpc、id、result 的响应外壳;这与回调式接口的取值方式不同(依据:EIP-1193 §request、§Appendix III Legacy Provider API)。
【协议保证】新的事件订阅接口是 on 与 removeListener,与历史事件名不混用(依据:EIP-1193 §Events)。
【协议保证】request 的参数结构为 { method, params },方法名与参数由对应 RPC 规范定义(依据:EIP-1193 §request)。
【实现行为】wagmi 的 injected connector 提供 target、shimDisconnect 等参数,用于适配不同注入环境下的连接与断开行为(依据:wagmi injected connector 页面 §Parameters)。
send 与 request 两条分支,行为差异带来难以复现的缺陷。sendAsync 写法,再把回调结果当作 request 的 resolve 值使用。networkChanged 等历史事件名,链变化通知不再触发。send 的返回值直接当作方法结果,忽略它在不同钱包中的形态差异。sendAsync 与 request 在错误处理上的差异是什么?迁移时错误分支要怎么改?request 是当前接口,send、sendAsync 属于历史接口。close、networkChanged、notification 分别对应 disconnect、chainChanged、message。发现这道题有问题? 反馈此题