diff --git a/src/ch17-01-futures-and-syntax.md b/src/ch17-01-futures-and-syntax.md
index 03fba80..e59c012 100644
--- a/src/ch17-01-futures-and-syntax.md
+++ b/src/ch17-01-futures-and-syntax.md
@@ -55,7 +55,108 @@ $ cargo add trpl
> 注意:这不同于上一章节中 `thread::spawn` 的行为,当时传递给另一个线程的闭包会立即开始运行。这也与许多其他语言处理异步的方式不同!但对于 Rust 而言,这一点非常重要。稍后我们会解释原因。
+当我们有了 `response_text` 函数,就可以使用 `Html::parse` 将其解析为一个 `Html` 类型的实例。不同于原始字符串,现在我们有了一个可以将 HTML 作为更丰富数据结构来操作的数据类型。特别是我们可以使用 `select_first` 方法来找出给定 CSS 选择器(selector)中第一个匹配元素。通过传递字符串 `"title"`,我们会得到文档中的第一个 `
` 元素,如果它存在的话。由于可能没有任何匹配的元素,`select_first` 返回一个 `Option`。最后我们使用 `Option::map` 方法,它允许我们在 `Option` 中有元素时对其进行处理,而在没有时则什么也不做。(这里也可以使用一个 `match` 表达式,但 `map` 更符合惯用的写法。)在传递给 `map` 的函数体中,我们调用了 `title_element` 上的 `inner_html` 来获取其内容,这是一个 `String`。当上面所讲的都完成后,我们会得到一个 `Option`。
+注意 Rust 的 `await` 关键字出现在需要等待的表达式之后而不是之前。也就是说,这是一个 *后缀关键字*(*postfix keyword*)。如果你在其它语言中使用过 async 的话,这可能与你所熟悉的有所不同。Rust 如此选择是因为这使得方法的链式调用更加简洁。因此,我们可以修改 `page_url_for` 的函数体来链式调用 `trpl::get` 和 `text` 并在其之间使用 `await`,如示例 17-2 所示:
+
+
+
+
+这样我们就成功编写了第一个异步函数!在我们向 `main` 加入一些代码调用它之前,让我们再多了解下我们写了什么以及它的意义。
+
+当 Rust 遇到一个 `async` 关键字标记的代码块时,会将其编译为一个实现了 `Future` trait 的唯一的、匿名的数据类型。当 Rust 遇到一个被标记为 `async` 的函数时,会将其编译进一个拥有异步代码块的非异步函数。异步函数的返回值类型是编译器为异步代码块所创建的匿名数据类型。
+
+因此,编写 `async fn` 就等同于编写一个返回类型的 *future* 的函数。当编译器遇到类似示例 17-1 中 `async fn page_title` 的函数定义时,它等价于以下定义的非异步函数:
+
+```rust
+# extern crate trpl; // required for mdbook test
+use std::future::Future;
+use trpl::Html;
+
+fn page_title(url: &str) -> impl Future