#promise #js #approximation #bad #completer #scheduler

swear

在 Rust 中对 JS A+ Promise 的近似的一个糟糕实现

1 个不稳定版本

使用旧的 Rust 2015

0.1.0 2018 年 2 月 25 日

#15 in #bad

MIT 许可证

14KB
292

咒骂

Build Status

这是一个在 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