

 適用於 JavaScript 的 AWS SDK v2 已end-of-support。我們建議您遷移至 [適用於 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` 會立即開始呼叫服務，並傳回以回應 `data` 屬性履行的 promise，或是以回應 `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。使用 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.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 支援 Promise
<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 程式庫會很有幫助。

請呼叫全域組態物件的 `setPromisesDependency` 方法，並在軟體開發套件上設定 promise 相依性，即可使用第三方 promise 程式庫。在瀏覽器指令碼中，請務必先載入第三方 promise 程式庫，再載入軟體開發套件。在下方範例中，軟體開發套件已設定為使用 bluebird promise 程式庫中的實作。

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

若要恢復使用 JavaScript 引擎的原生 promise 實作，您可以再次呼叫 `setPromisesDependency` 並傳遞 `null`，而不傳送程式庫名稱。