Effect 怎么做轮询和定时重复?
retry 在失败之后再来一次,轮询、心跳、定时任务却是成功之后再来一次,需要的是另一个方法。
答案是:用 Effect.repeat,配一个 Schedule 决定间隔,再用 until 决定什么时候停。 它是 retry 的镜像,两者消费的是同一种 Schedule 值。
下面看轮询怎么写、怎么停,以及它和 retry 共用策略的好处。Schedule 本身是什么、有哪些原语,见 Effect 里怎么给偶发失败的调用加重试。
轮询怎么写,怎么停?
import { Effect, Schedule } from "effect"
declare const checkJob: Effect.Effect<{ readonly done: boolean }>
export const poll = checkJob.pipe(
Effect.repeat({
schedule: Schedule.spaced("2 seconds"),
until: (r) => r.done
})
)每 2 秒检查一次,until 对成功的结果为真时停止。
同一个 Schedule 能给 retry 和 repeat 共用吗?
能。同一个 Schedule 值既能喂给 retry 也能喂给 repeat,这就是策略与动作分离的回报:节拍怎么写只需要想一次。
常驻的轮询怎么收场?
后台常驻的轮询通常还要放进某个 Scope 里,随着 Scope 关闭而被中断,见 Effect 资源与 Scope。
本文以 effect v4 为准,原文没有标注具体版本号。轮询示例取自原章节,没有对真实任务运行;「放进 Scope 随之中断」只是对原文做法的转述,没有单独验证。