

适用于 JavaScript 的 AWS SDK v2 已终止支持。建议您迁移到 [适用于 JavaScript 的 AWS SDK v3](https://docs.aws.amazon.com//sdk-for-javascript/v3/developer-guide/)。有关更多详情和如何迁移的信息，请参阅本[公告](https://aws.amazon.com/blogs//developer/announcing-end-of-support-for-aws-sdk-for-javascript-v2/)。

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

`AWS.Request.promise` 方法提供了一种方式来调用服务操作和管理异步流，而不使用回调。在 Node.js 和浏览器脚本中，未使用回调函数调用了服务操作时，将返回 `AWS.Request` 对象。您可以调用请求的 `send` 方法来发出服务调用。

但是，`AWS.Request.promise` 立即启动服务调用并返回 promise，其中通过响应 `data` 属性来执行，或者通过响应 `error` 属性来拒绝。

```
var request = new AWS.EC2({apiVersion: '2014-10-01'}).describeInstances();

// create the promise object
var promise = request.promise();

// handle promise's fulfilled/rejected states
promise.then(
  function(data) {
    /* process the data */
  },
  function(error) {
    /* handle the error */
  }
);
```

接下来的示例返回 promise，其中通过 `data` 对象来执行，或者通过 `error` 对象来拒绝。使用 promise，单个回调不负责检测错误。相反，根据请求的成功或失败来调用正确的回调。

```
var s3 = new AWS.S3({apiVersion: '2006-03-01', region: 'us-west-2'});
var params = {
  Bucket: 'bucket',
  Key: 'example2.txt',
  Body: 'Uploaded text using the promise-based method!'
};
var putObjectPromise = s3.putObject(params).promise();
putObjectPromise.then(function(data) {
  console.log('Success');
}).catch(function(err) {
  console.log(err);
});
```

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

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

在以下示例中，AWS Lambda 函数必须对 Amazon DynamoDB 进行三个异步调用，但只有在执行了各个调用的 promise 时才能完成。

```
Promise.all([firstPromise, secondPromise, thirdPromise]).then(function(values) {
  
  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 the result to the caller of the Lambda function
  callback(null, values);
});
```

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

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

## 使用其他 Promise 实施
<a name="using-other-promise-implementations"></a>

除了 ECMAScript 2015 中的原生 promise 实施之外，您还可以使用第三方 promise 库，包括：
+ [bluebird](http://bluebirdjs.com)
+ [RSVP](https://github.com/tildeio/rsvp.js/)
+ [Q](https://github.com/kriskowal/q)

如果您的环境不支持 ECMAScript 5 和 ECMAScript 2015 中的原生 promise 实施，而您需要在环境中运行代码，这些可选的 promise 库会非常有用。

要使用第三方 promise 库，请通过在全局配置对象上调用 `setPromisesDependency` 方法，在开发工具包上设置 promise 依赖关系。在浏览器脚本中，请确保先加载第三方 promise 库，然后加载开发工具包。在以下示例中，开发工具包配置为使用 bluebird promise 库中的实施。

```
AWS.config.setPromisesDependency(require('bluebird'));
```

要返回使用 JavaScript 引擎的原生 promise 实施，请再次调用 `setPromisesDependency`，传递 `null` 而不是库名。