Promise.all似乎过早地回来了。我在这里错过了什么?

时间:2017-10-15 22:46:24

标签: node.js amazon-web-services aws-lambda

我在AWS Lambda函数(Node 4.3运行时)中运行以下代码。由于deleteSnapshot操作未运行,Promise.all似乎过早返回。我对Node.js比较陌生,所以我肯定我错过了一些明显的东西。但它是什么?

EC2.describeSnapshots(searchParams).promise().then((data) => {
    Promise.all(data.Snapshots.map((snapshot) => {
       var deleteParams = {SnapshotId: snapshot.SnapshotId};
       console.log('Deleting ' + snapshot.SnapshotId + ' pertaining to AMI ' + event.detail.requestParameters.imageId);
       return EC2.deleteSnapshot(deleteParams).promise();
    })).then(context.done());
});

2 个答案:

答案 0 :(得分:1)

Promise.all()返回一个承诺。您需要从then()返回该承诺,否则第一个then()返回undefined,context.done()将很快被调用。

EC2.describeSnapshots(searchParams).promise().then((data) => {
    return Promise.all(data.Snapshots.map((snapshot) => {
    // etc.

答案 1 :(得分:1)

问题在于您立即调用context.done(),然后将返回的内容传递给Promise.all().then()。那不是你想要或打算做的。您需要将函数引用传递给.then(),而不是调用context.done()的结果。你可以像这样解决它:

EC2.describeSnapshots(searchParams).promise().then((data) => {
    return Promise.all(data.Snapshots.map((snapshot) => {
       var deleteParams = {SnapshotId: snapshot.SnapshotId};
       console.log('Deleting ' + snapshot.SnapshotId + ' pertaining to AMI ' + event.detail.requestParameters.imageId);
       return EC2.deleteSnapshot(deleteParams).promise();
    })).then(() => context.done());    // <== Note change here
});

要解释一下,当你有这个代码时:

 Promise.all(...).then(context.done())

这与此类似:

 let temp = context.done();
 Promise.all(...).then(temp);

因此,您可以清楚地看到您过早地调用context.done()方式。相反,您需要将context.done()放在某种函数包装器中,以便将该包装函数引用传递给.then()。实际上有多种方法可以做到这一点 - 我使用上面的箭头函数展示了它,但也可以使用.bind()来完成,如

  })).then(context.done.bind(context));