sof3/await-rt

dev-master 2023-10-30 01:02 UTC

This package is auto-updated.

Last update: 2024-08-30 01:26:49 UTC


README

await-rt 是await-generator 库的低级运行时。有关初学者的介绍,请参阅 await-generator 仓库或书籍

规范

await-rt 执行符合 await-generator 协议的生成器

  • 生成器的状态转换
    • 生成器在被传递给 Await::run() 之前不得开始执行。
    • 当传递给 Await::run() 时,生成器进入 运行 状态。它立即回滚并同步执行,直到其第一个挂起点。控制流最终将返回到 Await::run() 的调用者。
    • 当一个处于任何状态的生成器使用字符串 "identity" 挂起时,它将使用回滚生成器的 Await::run() 调用中唯一的任意类对象同步恢复。
    • 当一个处于 运行 状态的生成器使用字符串 "resolve" 挂起时,它将使用类型为 Closure(value=): void 的 "resolve 闭包" 同步恢复。生成器状态变为 调度/单
    • 当一个处于 调度/单 状态的生成器使用字符串 "reject" 挂起时,它将使用类型为 Closure(Throwable): void 的 "reject 闭包" 同步恢复。生成器状态变为 调度/双
    • 当一个处于 调度/单调度/双 状态的生成器使用字符串 "once" 挂起时,生成器状态变为 挂起 并不会主动恢复。
    • 当生成器处于 调度/单调度/双 状态并且调用 resolve 闭包时,生成器状态变为 就绪/单就绪/双。由于生成器应在调度状态执行,闭包将正常返回,将控制流返回给生成器。
    • 当生成器处于 调度/双 状态并且调用 reject 闭包时,生成器状态变为 失败。由于生成器应在调度状态执行,闭包将正常返回,将控制流返回给生成器。
    • 当生成器处于 就绪/单就绪/双 状态并且使用字符串 "once" 挂起时,生成器状态变为 运行,并且生成器将使用先前传递给 resolve 闭包的值(如果没有传递则使用 null)同步恢复。
    • 当生成器处于 失败 状态并且使用字符串 "once" 挂起时,生成器状态变为 运行,并且生成器将使用先前传递给 reject 闭包的可抛出值同步中断。这实际上与将 yield "once" 替换为 throw $throwable 相同。
    • 当生成器处于 挂起 状态并且调用 resolve 闭包时,生成器将使用传递的值(如果没有传递则使用 null)同步恢复。控制流最终将返回到 resolve 闭包的调用者。
    • 当生成器处于 挂起 状态并且调用 reject 闭包时,生成器将使用传递的值(如果没有传递则使用 null)同步中断。控制流最终将返回到 reject 闭包的调用者。最早不早于下一次生成器进入 挂起返回抛出 状态,但确切时间未定义。
    • 当生成器处于 运行 状态并从生成器返回时,控制流将返回到 最终回滚
    • 当生成器处于运行状态并从生成器抛出异常时,控制流会返回到最终回滚,并带有活跃的异常抛出。
      • 注意:这与await-generator v3不同,在v3中异常会被包装在AwaitException中。
  • 以上未指定的所有状态转换都将导致抛出一个任意类型、扩展或等于\Exception的异常。
  • 在生成器恢复到运行状态后调用resolve闭包会导致抛出一个任意类型、扩展或等于\Exception的异常。
  • 术语最终最终回滚指的是以下情况:当控制流传递到await运行时,即通过调用Await::run、resolve闭包或reject闭包,控制流返回给调用者的确切时刻或顺序是未定义的,但如果有生成器没有主动触发任何无限阻塞的代码,则保证最终会发生。然而,如果没有任何其他调用者,如果生成器进入运行状态然后立即返回抛出,则控制流会立即返回给调用者。