33 lines
1.7 KiB
Plaintext
33 lines
1.7 KiB
Plaintext
// 把 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))
|