2017-10-15 13 views
0

以下のコードをAWS Lambda関数(ノード4.3ランタイム)で実行しています。 Promise.allは、deleteSnapshotアクションが実行されていないため、途中で戻っているようです。私はNode.jsには比較的新しいので、ここでは明らかに何かが分からないと確信しています。しかし、それは何ですか?Promise.allが途中で返っているようです。私はここで何が欠けていますか?

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()); 
}); 

答えて

1

問題は、あなたがすぐにcontext.done()を呼び出した後、Promise.all().then()に返すどんな渡しているということです。それは、あなたがしたい、またはしたいことではありません。 .then()に関数参照を渡す必要があります。context.done()を呼び出した結果ではありません。あなたはこのようにそれを修正することができます:

Promise.all(...).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 
}); 

はもう少し説明するためにあなたは、このコードを持っているとき、そう

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

を、することができますあまりにも早くcontext.done()と呼んでいることがはっきり分かります。その代わりに、.then()にそのラッパー関数のリファレンスを渡すことができるように、何らかの関数ラッパーにcontext.done()を入れる必要があります。実際にはこれを行う方法は複数ありますが、上の矢印の機能を使って示しましたが、

のように .bind()
})).then(context.done.bind(context)); 
のようにすることもできます
1

Promise.all()は約束を返します。その約束をthen()から返す必要があります。そうでなければ、最初のthen()は未定義を返し、context.done()はあまりにも早く呼び出されます。

EC2.describeSnapshots(searchParams).promise().then((data) => { 
    return Promise.all(data.Snapshots.map((snapshot) => { 
    // etc. 
関連する問題