// owner 作用域决定取消时机:Page 关闭会取消其任务,隐藏 Block 和 ui 的任务可继续。 // 每个 owner 下同 key 的重复点击替换旧定时器;任务生命周期不由画面是否可见推断。 // 把 owner 与要修改的 state 分开持有,使同一个调度方法可用于三个作用域。 class Actions { owner: Object state: Object // 定时任务成功交付后修改共享计数,零参数签名符合 timer 回调要求。 function complete(self: Actions): Unit { self.state.increment() } // 每次启动 1500ms 的 load 定时器;相同 owner/key 只有最新任务继续等待。 function schedule(self: Actions, event: Event): Unit { ui.after(self.owner, "load", 1500, self.complete) } } state = ui.state(0) // 该 Block 从未进入页面树,但全局引用仍持有它,因此它拥有的任务可执行。 hidden = TextBlock("这个 Block 没有挂载,也能拥有任务") page = Page() page.title = "任务生命周期" // 三个 Action 共享一个 state,却分别归属 Page、Block、应用,便于比较关闭页面的取消边界。 pageActions = Actions(page, state) blockActions = Actions(hidden, state) appActions = Actions(ui, state) pageButton = Button("Page 任务:关闭 Tab 会取消") blockButton = Button("隐藏 Block 任务:关闭 Tab 仍继续") appButton = Button("应用任务:关闭 Tab 仍继续") pageConnection = pageButton.on("click", pageActions.schedule) blockConnection = blockButton.on("click", blockActions.schedule) appConnection = appButton.on("click", appActions.schedule) page.render(Column(24, 16, TextBlock("1.5 秒后更新同一个状态对象;重复点击只保留最新任务"), ui.textOf(state, "value"), pageButton, blockButton, appButton)) // 额外应用级任务延迟 500ms,用于展示没有点击也可按 worker 空闲轮询交付。 initial = ui.after(ui, "initial", 500, appActions.complete) ui.window().setTitle("Owned Tasks")