sof3 / await-rt
dev-master
2023-10-30 01:02 UTC
Requires
- php: ^8.2
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.4
- phpstan/phpstan: ^1.2
- phpunit/phpunit: ^10.3
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
中。
- 注意:这与await-generator v3不同,在v3中异常会被包装在
- 生成器在被传递给
- 以上未指定的所有状态转换都将导致抛出一个任意类型、扩展或等于
\Exception
的异常。 - 在生成器恢复到运行状态后调用resolve闭包会导致抛出一个任意类型、扩展或等于
\Exception
的异常。 - 术语最终或最终回滚指的是以下情况:当控制流传递到await运行时,即通过调用
Await::run
、resolve闭包或reject闭包,控制流返回给调用者的确切时刻或顺序是未定义的,但如果有生成器没有主动触发任何无限阻塞的代码,则保证最终会发生。然而,如果没有任何其他调用者,如果生成器进入运行状态然后立即返回或抛出,则控制流会立即返回给调用者。