使用 JavaScript Promise - AWS SDK for JavaScript

我们已宣布即将终止对 AWS SDK for JavaScript v2 的支持。建议您迁移到 AWS SDK for JavaScript v3。有关日期、其他详细信息以及如何迁移的信息,请参阅链接的公告。

使用 JavaScript Promise

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

在某些情况下,您的代码必须进行多个异步调用,这些调用只有在它们都成功返回时才需要执行操作。如果您使用 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 支持

对原生 JavaScript promise (ECMAScript 2015) 的支持取决于执行代码的 JavaScript 引擎和版本。为帮助确定您要运行代码的各个环境中的 JavaScript promise 支持情况,请参阅 GitHub 上的 ECMAScript 兼容性表

使用其他 Promise 实施

除了 ECMAScript 2015 中的原生 promise 实施之外,您还可以使用第三方 promise 库,包括:

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

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

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

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