1 个不稳定版本
使用旧的 Rust 2015
0.1.0 | 2018 年 2 月 25 日 |
---|
#15 in #bad
14KB
292 行
咒骂
这是一个在 Rust 中对 JS A+ Promises 的一些近似实现的糟糕实现。
这并不是按照规范实现的,为了使 API 稍微更符合 Rust 风格,或者出于其他有见地的原因,已经进行了修改。
它仅适用于单线程应用程序(没有类型实现 Sync),代码的编写以简洁为主,性能为辅。
你可能想查看 Futures 以获取在 Rust 中更广泛支持的 Promises / Futures / Deferreds 实现。
动机
我在玩弄 stdweb 和 wasm32-unknown-unknown,并发现直接无法使用 futures::unsync 工具。作为一个在 Rust 中探索生命周期管理的练习,并创建一个我可以与 stdweb 一起使用的工具,我创建了 Swear。
设计主要是为了创建一个在 Rust 中编写基于 Promise 模式的 wasm-unknown-unknown 前端时有用的工具。
概念
咒骂
此包中的核心工具是类似于 JavaScript Promise 的 Swear
。一个 Swear
可以恰好一次被调用 .then
,并调用一个 FnOnce 回调,该回调在 Swear
履行时被调用。
当你使用 make_swear
从头开始构建 Swear
时,你还将收到一个 Completer
,一个你调用 complete
(再次恰好一次)以履行咒骂的对象。
调度器
关于一旦咒骂被履行,应该从哪个堆栈调用回调有一些疑问。
一个选项是咒骂一履行就立即从活动的堆栈中调用它
请注意,在不同的情况下,这可能会以微妙的方式有所不同
选项 A
- 咒骂被创建。
- 对咒骂调用了 then 并提供了回调。
- 咒骂被履行。 <-- 咒骂回调是从这个堆栈调用的
选项 B
- 咒骂被创建。
- 咒骂被履行。
- 对咒骂调用了 then 并提供了回调。 <-- 咒骂回调是从这个堆栈调用的
为了避免对回调何时被调用(以及随后捕获的所有变量的生命周期)产生混淆,此实现选择始终“调度”回调以从某个外部调度器运行。
等效分析
选项 A
- 咒骂被创建。
- 对咒骂调用了 then 并提供了回调。
- 咒骂被履行。 <-- 咒骂回调是从这个堆栈调度的
- 当前回调/任务完成之后,咒骂回调将直接从调度器调用。
选项 B
- 咒骂被创建。
- 咒骂被履行。
- 对咒骂调用了 then 并提供了回调。 <-- 咒骂回调是从这个堆栈调度的
- 当前回调/任务完成之后,咒骂回调将直接从调度器调用。
这可能会对缓存一致性更差,但统一了
包装中提供了一个简单的“运行队列”实现,类似的JavaScript实现将是“window.setTimeout(callback, 0)”。
这要求闭包(及其引用)的生存期通常要长于当前栈(实际上,被引用的对象必须在运行队列的整个生存期内保持活跃,不知道它将在何时执行计划中的回调)。
示例
在 tests/
目录中有两个简单的示例,展示了如何在Swears上进行简单的then操作。如果回调返回另一个Swear,则使用 and_then
,如果回调返回非Swear值,则使用 then
。
依赖项
~17KB