// 把 callback-free 文件 Task 与 ui.spawn 协作函数组合:await 保存执行位置,等待完成后继续,不阻塞 VM worker。 // readText 的 file 与 spawn 的 workflow 使用不同 key,分别管理读取和等待流程。 // 保存 provider Task、协程 Task 和结果;两种任务都是托管对象,可以从 Console 独立查看。 class AwaitReader { output: TextBlock status: TextBlock task: Object file: Object response: String // await 在文件未完成时挂起并保留 self/操作数;恢复后只执行后半段一次,再把字符串作为 workflow.result。 function apply(self: AwaitReader): String { self.response = await self.file self.output.text = "读取完成;在 REPL 查看 reader.response 或 reader.task.result()" return self.response } // 先创建读任务,再调度普通函数 apply;spawn 而非新 async 语法提供可暂停执行上下文。 function read(self: AwaitReader, path: String): Unit { self.file = ui.readText(self, "file", path) self.task = ui.spawn(self, "workflow", self.apply) self.response = "" self.output.text = "等待文件" // 显示的是 workflow 状态,等待 provider 时它仍报告 running;结束后 result 可从 Task 或 response 读取。 self.status.bind("text", self.task.status) } } output = TextBlock("在 REPL 调用 reader.read(绝对路径字符串)") status = TextBlock("") // 占位值只用于满足初始字段构造;在 read 内被真实 Task 替换,页面建立不自动读文件。 reader = AwaitReader(output,status,ui.state(0),ui.state(0),"") page = Page() page.title = "await 文件" page.render(Column(24,16,status,output))