2017-10-15 1 views
0

Ich führe den folgenden Code in einer AWS Lambda-Funktion (Node 4.3 Laufzeit). Promise.all scheint zu früh zurückzukehren, da die Aktion deleteSnapshot nicht ausgeführt wird. Ich bin relativ neu bei Node.js, also bin ich mir sicher, dass ich hier etwas offensichtliches vermisse. Aber was ist es?Promise.all scheint vorzeitig zurückzukehren. Was fehlt mir hier?

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

Antwort

1

Das Problem ist, dass Sie context.done() sofort und dann sind rufen, was auch immer vorbei, das zu Promise.all().then() zurückgibt. Das ist nicht das, was Sie wollen oder tun wollen. Sie müssen eine Funktionsreferenz an übergeben, nicht das Ergebnis des Aufrufs context.done(). Man könnte es wie dieses Problem zu beheben:

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

Um ein wenig mehr zu erklären, wenn Sie diesen Code haben:

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

, die diesem ähnlich ist:

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

So können Sie deutlich sehen, dass Sie context.done() viel zu früh anrufen. Stattdessen müssen Sie context.done() in eine Art von Funktions-Wrapper versetzen, damit Sie diese Wrapperfunktionsreferenz an übergeben können. Es gibt tatsächlich mehrere Möglichkeiten, dies zu tun - ich zeigte mit einer Pfeil-Funktion oben, aber es könnte auch mit .bind() wie in

})).then(context.done.bind(context)); 
getan werden
1

Promise.all() gibt ein Versprechen. Sie müssen das Versprechen von der then() zurückgeben, andernfalls die erste then() zurückgibt undefined und context.done() wird zu früh aufgerufen.

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