

 [适用于 JavaScript 的 AWS SDK V3 API 参考指南](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/)详细描述了 适用于 JavaScript 的 AWS SDK 版本 3 (V3) 的所有 API 操作。

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

# 异步调用服务
<a name="calling-services-asynchronously"></a>

通过 SDK 发出的所有请求均为异步。在编写浏览器脚本时，请务必记住这一点。 JavaScript 在 Web 浏览器中运行通常只有一个执行线程。对 AWS 服务进行异步调用后，浏览器脚本继续运行，在此过程中可以尝试在返回之前执行依赖于该异步结果的代码。

对 AWS 服务进行异步调用包括管理这些调用，这样您的代码就不会在数据可用之前尝试使用数据。本部分中的主题说明管理异步调用的需求，以及在管理它们时可以使用的具体不同技术。

尽管您可以使用这些技术中的任何一种来管理异步调用，但我们建议您在所有新代码中都使用 async/await 这种方法。

异步/等待  
我们建议您使用此技术，因为这是 V3 中的默认行为。

Promise  
在不支持异步/等待的浏览器中使用此技术。

回调  
除非在非常简单的情况下，否则请避免使用回调。但是，您可能会发现它对迁移场景很有用。

**Topics**
+ [管理异步调用](making-asynchronous-calls.md)
+ [使用异步/等待](using-async-await.md)
+ [使用 JavaScript 承诺](using-promises.md)
+ [使用匿名回调函数](using-a-callback-function.md)

# 管理异步调用
<a name="making-asynchronous-calls"></a>

例如，电子商务网站的主页会让返回的客户登录。客户登录可以获得的一部分好处在于，登录之后网站可以根据其特定首选项进行自定义。要做到这一点：

1. 客户必须登录并使用其登录凭证进行验证。

1. 从客户数据库中请求客户的首选项。

1. 数据库提供客户的首选项，这些首选项用于在页面加载之前自定义网站。

如果这些任务同步执行，则必须在每个任务完成之后才能执行下一个任务。在数据库返回客户首选项之前，网页无法完成加载。但是，在数据库查询发送到服务器之后，由于网络瓶颈、极高的数据库流量或者糟糕的移动设备连接，客户数据的接收可能会延迟甚至失败。

要避免网站在这些情况下停滞不前，可以异步调用数据库。数据库调用执行之后，发送您的异步请求，您的代码继续按预期方式执行。如果您未能正确地管理异步调用的响应，代码会在数据尚不可用时，尝试使用预期从数据库返回的信息。

![\[显示同步和异步执行之间的差别。\]](http://docs.aws.amazon.com/zh_cn/sdk-for-javascript/v3/developer-guide/images/async-vs-sync.png)


# 使用异步/等待
<a name="using-async-await"></a>

您应该考虑使用异步/等待，而不是 Promise。与使用 Promise 相比，异步函数更简单，并且需要的样板文件更少。等待只能在异步函数中用于异步等待值。

以下示例用于列 async/await 出您在中的所有亚马逊 DynamoDB 表。` us-west-2`

**注意**  
运行此示例需执行的操作：  
通过在项目的 适用于 JavaScript 的 AWS SDK 命令行中`npm install @aws-sdk/client-dynamodb`输入来安装 DynamoDB 客户端。
确保您的 AWS 凭证配置正确。有关更多信息，请参阅 [设置凭证](setting-credentials.md)。

```
import {
  DynamoDBClient,
  ListTablesCommand
} from "@aws-sdk/client-dynamodb";
(async function () {
  const dbClient = new DynamoDBClient({ region: "us-west-2" });
  const command = new ListTablesCommand({});

  try {
    const results = await dbClient.send(command);
    console.log(results.TableNames.join('\n'));
  } catch (err) {
    console.error(err)
  }
})();
```

**注意**  
 并非所有浏览器都支持异步/等待。有关 async/await 支持的浏览器列表，请参阅[异步函数](https://caniuse.com/#feat=async-functions)。

# 使用 JavaScript 承诺
<a name="using-promises"></a>

使用服务客户端的 适用于 JavaScript 的 AWS SDK v3 方法 (`ListTablesCommand`) 进行服务调用和管理异步流，而不是使用回调。以下示例演示如何获取 `us-west-2` 中您的 Amazon DynamoDB 表的名称。

```
import {
  DynamoDBClient,
  ListTablesCommand
} from "@aws-sdk/client-dynamodb";
const dbClient = new DynamoDBClient({ region: 'us-west-2' });

dbClient.listtables(new ListTablesCommand({}))
  .then(response => {
    console.log(response.TableNames.join('\n'));
  })
  .catch((error) => {
    console.error(error);
  });
```

## 协调多个 Promise
<a name="multiple-promises"></a>

在某些情况下，您的代码必须进行多个异步调用，这些调用只有在它们都成功返回时才需要执行操作。如果您使用 promise 管理这些单独的异步方法调用，则可以创建使用 `all` 方法的额外 promise。

此方法只有在执行了您传递到方法中的 promise 数组时，才会执行此伞形 promise。回调函数将 promise 的值数组传递到 `all` 方法。

在以下示例中，一个 AWS Lambda 函数必须对 Amazon DynamoDB 进行三次异步调用，但只能在每个调用的承诺兑现后才能完成。

```
const values = await Promise.all([firstPromise, secondPromise, thirdPromise]);

console.log("Value 0 is " + values[0].toString);
console.log("Value 1 is " + values[1].toString);
console.log("Value 2 is " + values[2].toString);

return values;
```

## Promise 的浏览器和 Node.js 支持
<a name="browser-node-promise-support"></a>

对原生 JavaScript 承诺 (ECMAScript 2015) 的支持取决于执行代码的 JavaScript引擎和版本。为了帮助确定您的代码需要运行的每个环境中对 Prom JavaScript ise 的支持，请参阅上的[ECMAScript 兼容性表](https://compat-table.github.io/compat-table/es6/) GitHub。

# 使用匿名回调函数
<a name="using-a-callback-function"></a>

每个服务对象方法都可以接受匿名回调函数作为最后一个参数。此回调函数的签名如下。

```
function(error, data) {
    // callback handling code
};
```

此回调函数在返回成功响应或错误数据时执行。如果方法调用成功，则响应的内容在 `data` 参数中供回调函数使用。如果调用不成功，则在 `error` 参数中提供有关失败的详细信息。

通常，回调函数内部的代码经过了错误测试，在返回错误时会进行处理。如果未返回错误，则代码从 `data` 参数检索响应中的数据。回调函数的基本格式如此例中所示。

```
function(error, data) {
    if (error) {
        // error handling code
        console.log(error);
    } else {
        // data handling code
        console.log(data);
    }
};
```

在以上示例中，错误的详细信息或者返回的数据记录到控制台中。此处的示例演示了作为对服务对象调用方法的一部分传递的回调函数。

```
ec2.describeInstances(function(error, data) {
  if (error) {
    console.log(error); // an error occurred
  } else {
    console.log(data); // request succeeded
  }
});
```