33 lines
1.6 KiB
Plaintext
33 lines
1.6 KiB
Plaintext
// 异步 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))
|