使用 JavaScript 承諾 - AWS SDK for JavaScript

我們宣布了即將推 end-of-support 出的 AWS SDK for JavaScript v2。我們建議您移轉至 AWS SDK for JavaScript v3。有關日期,其他詳細信息以及如何遷移的信息,請參閱鏈接的公告。

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 JavaScript 承諾

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

在某些情況下,程式碼必須發出多個非同步呼叫,且唯有在這些呼叫全部成功回傳時,才需要採取動作。如果您要透過 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

對原生 JavaScript 承諾 (ECMAScript 2015) 的 Support 取決於程式碼執行的 JavaScript 引擎和版本。若要協助判斷程式碼需要執行之每個環境中 JavaScript 承諾的支援,請參閱上的 ECMAScript 相容性表格。 GitHub

使用其他 Promise 實作

除了 ECMAScript 2015 中的原生 promise 實作外,您也能運用第三方的 promise 程式庫,包括:

如果您需要在不支援 ECMAScript 5 和 ECMAScript 2015 原生 promise 實作的環境中執行程式碼,則這些選用 promise 程式庫會很有幫助。

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

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

要返回使用 JavaScript 引擎的本機 promise 實現,請setPromisesDependency再次調用,傳遞一個null而不是庫名稱。