// 异步 HTTP(S) 文本 GET:Console 调用 fetcher.fetch(url),沿用 owner/key 替换、状态与成功回调协议。 // 完整响应保存为 String,界面只显示完成提示,避免把可能很大的响应放进文字控件。 // response 是结果业务存储;output/problem/status 仅呈现任务进度与提示。 class TextFetcher { output: TextBlock problem: TextBlock status: TextBlock task: Object response: String // 成功后取出完整 UTF-8 结果,写 response 供 Console 查询;provider 失败不会进入此方法。 function apply(self: TextFetcher): Unit { self.response = self.task.result() self.output.text = "请求完成;在 REPL 查看 fetcher.response" } // 同一 self/request 身份的新请求取消旧交付,重置旧内容并把显示绑定到新任务。 function fetch(self: TextFetcher, url: String): Unit { self.task = ui.fetchText(self, "request", url, self.apply) self.response = "" self.output.text = "" // 绑定读取当前 Task 方法,完成和失败由 worker 的任务状态变更传播。 self.status.bind("text", self.task.status) self.problem.bind("text", self.task.error) } } // 界面不自动访问网络,用户以 Console 明确指定 URL 后才创建任务。 output = TextBlock("尚未请求网络") problem = TextBlock("") status = TextBlock("") fetcher = TextFetcher(output, problem, status, ui.state(0), "") page = Page() page.title = "异步网络" page.render(Column(24,16,TextBlock("在 REPL 调用 fetcher.fetch(HTTP 或 HTTPS 地址字符串)",2),status,problem,output))