我在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());
});
答案 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));