

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 在适用于 Rust 的 AWS SDK 中使用等待器
<a name="waiters"></a>

 等待器是一种客户端抽象，用于轮询资源，直到达到所需状态，或者直到确定资源不会进入所需状态。在使用最终一致的服务（例如 Amazon Simple Storage Service）或异步创建资源的服务（例如 Amazon Elastic Compute Cloud）时，这是一项常见的任务。编写逻辑以持续轮询资源状态可能非常繁琐且容易出错。等待器的目标是将这项责任从客户代码转移到适用于 Rust 的 AWS SDK，后者对 AWS 操作时机方面有深入了解。

AWS 服务为包含 `{{<service>}}::waiters` 模块的等待器提供支持。
+ `{{<service>}}::client::Waiters` 特性为客户端提供等待器方法。这些方法是为 `Client` 结构体实现的。所有等待器方法都遵循 `wait_until_{{<Condition>}}` 的标准命名约定 
  + 对于 Amazon S3，这个特性是 [https://docs.rs/aws-sdk-s3/latest/aws_sdk_s3/client/trait.Waiters.html](https://docs.rs/aws-sdk-s3/latest/aws_sdk_s3/client/trait.Waiters.html)。

以下示例使用的是 Amazon S3。但是，对于任何定义一个或多个等待器的 AWS 服务，概念都是一样的。

以下代码示例演示了如何使用等待器函数而不是编写轮询逻辑来等待存储桶在创建后存在。

```
use std::time::Duration;
use aws_config::BehaviorVersion;
// Import Waiters trait to get `wait_until_<Condition>` methods on Client.
use aws_sdk_s3::client::Waiters;


let config = aws_config::defaults(BehaviorVersion::latest())
    .load()
    .await;
    
let s3 = aws_sdk_s3::Client::new(&config);

// This initiates creating an S3 bucket and potentially returns before the bucket exists.
s3.create_bucket()
    .bucket("my-bucket")
    .send()
    .await?;

// When this function returns, the bucket either exists or an error is propagated.
s3.wait_until_bucket_exists()
    .bucket("my-bucket")
    .wait(Duration::from_secs(5))
    .await?;

// The bucket now exists.
```

**注意**  
 每个 wait 方法都会返回一个 `Result<FinalPoll<...>, WaiterError<...>> `，可用于在达到所需条件或返回所需错误后获得最终响应。有关详细信息，请参阅 Rust API 文档中的 [FinalPoll](https://docs.rs/aws-smithy-runtime-api/latest/aws_smithy_runtime_api/client/waiters/struct.FinalPoll.html) 和 [WaiterError](https://docs.rs/aws-smithy-runtime-api/latest/aws_smithy_runtime_api/client/waiters/error/enum.WaiterError.html)。