Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

修正错误ch17-01 #842

Merged
merged 1 commit into from
Dec 16, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/ch17-01-futures-and-syntax.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ $ cargo add trpl

在示例 17-1 中,我们定义了一个名为 `page_title` 的函数,并使用了 `async` 关键字标记。接着我们使用 `trpl::get` 函数来获取传入的任意 URL,然后使用 `await` 关键字来等待响应。接着我们调用其 `text` 方法来获取响应的文本,这里再一次使用 `await` 关键字等待。这两个步骤都是异步的。对于 `get` 来说,我们需要等待服务器发送回其响应的第一部分,这会包含 HTTP 头(headers)、cookies 等。这部分响应可以独立于响应体发送。特别是在响应体非常大时候,接收完整响应可能会花费一些时间。因此我们不得不等待响应 *整体* 返回,所以 `text` 方法也是异步。

我们必须显示地等待这两个 futures,因为 Rust 中的 futures 是 *惰性*(*lazy*)的:在你使用 `await` 请求之前它们不会执行任何操作。(事实上,如果你不使用一个 futures,Rust 会显示一个编译警告)这应该会让你想起[之前第十三章][iterators-lazy]关于迭代器的讨论。直到你调用迭代器的 `next` 方法(直接调用或者使用 `for` 循环或者类似 `map` 这类在底层使用 `next` 的方法)之前它们什么也不会做。对于 futures 来说,同样的基本理念也是适用的:除非你显式地请求,否则它们不会执行。惰性使得 Rust 可以避免提前运行异步代码,直到真正需要时才执行。
我们必须显式地等待这两个 futures,因为 Rust 中的 futures 是 *惰性*(*lazy*)的:在你使用 `await` 请求之前它们不会执行任何操作。(事实上,如果你不使用一个 futures,Rust 会显示一个编译警告)这应该会让你想起[之前第十三章][iterators-lazy]关于迭代器的讨论。直到你调用迭代器的 `next` 方法(直接调用或者使用 `for` 循环或者类似 `map` 这类在底层使用 `next` 的方法)之前它们什么也不会做。对于 futures 来说,同样的基本理念也是适用的:除非你显式地请求,否则它们不会执行。惰性使得 Rust 可以避免提前运行异步代码,直到真正需要时才执行。

> 注意:这不同于上一章节中 `thread::spawn` 的行为,当时传递给另一个线程的闭包会立即开始运行。这也与许多其他语言处理异步的方式不同!但对于 Rust 而言,这一点非常重要。稍后我们会解释原因。

Expand Down
Loading