

AWS SDK for JavaScript v2 はサポート終了となりました。[AWS SDK for JavaScript 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 Promises の使用
<a name="using-promises"></a>

`AWS.Request.promise` メソッドは、コールバックを使用する代わりに、サービスオペレーションを呼び出して非同期フローを管理する方法を提供します。Node.js とブラウザスクリプトでは、コールバック関数なしでサービスオペレーションが呼び出された場合に `AWS.Request` オブジェクトが返されます。リクエストの `send` メソッドを呼び出して、サービスの呼び出しを行うことができます。

ただし、`AWS.Request.promise` はすぐにサービス呼び出しを開始し、レスポンス `data` プロパティで満たされるか、レスポンス `error` プロパティで拒否された promise のいずれかを返します。

```
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 */
  }
);
```

次の例は、`data` オブジェクトで満たされるか、`error` オブジェクトで拒否された promise を返します。promises を使用すると、1 つのコールバックだけでエラーを検出することはありません。代わりに、リクエストの成功または失敗に基づいて、正しいコールバックが呼び出されます。

```
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);
});
```

## 複数の Promises の調整
<a name="multiple-promises"></a>

状況によって、コードは複数の非同期呼び出しを行う必要があります。すべてが正常に返されたときのみ、これらの呼び出しに対する操作が必要です。これらの個々の非同期メソッド呼び出しを promises で管理する場合、`all` メソッドを使用する追加の promise を作成することができます。このメソッドは、ユーザーがメソッドに渡す promise の配列が満たされた場合に、この包括的な promise を満たします。コールバック関数には、`all` メソッドに渡された promises の値の配列が渡されます。

次の例で、AWS Lambda 関数は Amazon DynamoDB に対して 3 回の非同期呼び出しを行う必要があります。ただし、各呼び出しの 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);
});
```

## ブラウザおよび Node.js による Promises のサポート
<a name="browser-node-promise-support"></a>

ネイティブ JavaScript の promises (ECMAScript 2015) のサポートは、コードが実行される JavaScript エンジンとバージョンによって異なります。コードを実行する必要がある各環境における JavaScript のサポートを確認するには、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)

これらオプションの promise ライブラリは、ECMAScript 5 および ECMAScript 2015 のネイティブの promise 実装をサポートしていない環境でコードを実行する必要がある場合に便利です。

サードパーティーの promise ライブラリを使用するには、グローバル設定オブジェクトの `setPromisesDependency` メソッドを呼び出して、SDK に promises の依存関係を設定します。ブラウザスクリプトでは、必ず SDK をロードする前にサードパーティーの promise ライブラリをロードしてください。次の例で、SDK は bluebird の promise ライブラリの実装を使用するように設定されています。

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

再び JavaScript エンジンのネイティブの promise 実装を使用するには、再度 `setPromisesDependency` を呼び出して、ライブラリ名の代わりに `null` を渡します。