一个点击事件,从React表单出发,经过模式校验,进入WebAssembly里的Rust求解器,再带着类型化的结果返回,最后渲染成热力图——全程没有try/catch。这是怎么做到的?
作者独立开发了三个库,把它们放进同一个项目后,边界消失了。核心设计是"可区分的返回值":用Result/Option代替异常控制流。如果你用过Rust、fp-ts或neverthrow,下面的代码会很自然;如果没用过,耐心看完 porkchop 那段,语法本身会证明价值。
![]()
先看场景:Lambert两点边值问题。给定位置向量r₁、r₂,飞行时间tof,引力参数μ,求连接它们的速度v₁、v₂。Dario Izzo 2014年发表了一个快速稳健的算法。地球到火星的发射窗口、卫星交会、 debris 清除任务——任何轨道转移设计都会用到它。porkchop图就是在这个窗口上画热力图,每个格子是总Δv,最便宜的格子就是发射窗口。
这个问题有明确的失败模式:几何退化、非正飞行时间、非有限浮点数、超范围圈数。这些不是异常,是情况。代码里统一处理:Result,Ok分支走成功路径,Err分支处理失败——包括重试、降级、或返回给用户。
关键在FFI边界。大多数TypeScript调用WASM时,包装层会捕获JS Error,判断是panic还是领域失败,再投射到应用层——铁路到这里就断了。lambert-izzo没有这个问题:Rust端全程Result,求解器对建模输入不panic;TypeScript包装层只做一件事,把Rust的和类型投射成JS的tagged union,不压平任何分支。
这个crate两种分发方式:crates.io上的纯Rust(no_std友好,[f64; 3] API,无硬数学依赖),以及wasm-pack打的npm包。WASM体积够小,普通浏览器直出。
代码示例被截断了,但核心已经清晰:从表单输入到Rust求解器,同一形状贯穿始终。异常控制流被彻底排除,接缝消失了。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.