33 lines
1.9 KiB
Plaintext
33 lines
1.9 KiB
Plaintext
// 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")
|