2017-01-20 1 views
1

Ich versuche, Versprechen in AWS Lambda zu verwenden und habe einige Probleme. Ich benutze typescript/nodejs; siehe Code untenAusführung nicht warten auf Versprechen Ergebnis in AWS Lambda

export function handler(event: any, context: any, callback: Function){ 

    testFunction().then(data => callback(null, "success from promise")); 
    callback(null, "success"); 
} 

export function testFunction(){ 
    return new Promise((resolve, reject) => { 
     setTimeout(() => resolve("data"), 5000); 
    }); 
} 

Wenn ich den Code ausführen ich erhalte den „Erfolg Rückruf“ statt den „Erfolg von Versprechen“. Mache ich hier etwas falsch?

+1

Es wird nicht warten, während Sie Ihre Funktion auflösen, bevor die Ausführung des Versprechens abgeschlossen ist. Wenn Sie 'callback (null," success ") entfernen;' sehen Sie das Ergebnis, das Sie erwarten. –

+0

Kann ich warten, bis die testFunction-Verzögerung beendet ist, bevor ich zur nächsten Codezeile übergehe? – mattc19

Antwort

5

Sie rufen tatsächlich den Rückruf zweimal: einmal in der vierten Zeile "success" und einmal nach dem Versprechen verrechnet. Ich denke, dass Lambda im Wesentlichen den zweiten Rückruf ignorieren wird (der eigentlich in Ihrem Code zuerst ist).

Sie können nur den anderen Anruf entfernen:

export function handler(event: any, context: any, callback: Function){ 
    testFunction().then(data => callback(null, "success from promise")); 
} 

Hinweis: der Rückruf nur von Knoten 4.3 unterstützt wird. Es ist auch optional. Sie müssen es nur verwenden, wenn Sie Daten explizit an den Aufrufer übergeben möchten. Andernfalls wird es automatisch aufgerufen, sobald die Ereignisschleife leer ist, was in diesem Fall passieren wird, nachdem das Versprechen aufgelöst wurde.

Sie können auch die Einstellung context.callbackWaitsForEmptyEventLoop = false ändern, wenn die Lambda-Funktion sofort beendet werden soll, wenn callback aufgerufen wird, anstatt auf das Ende der Ereignisschleife zu warten. Höchstwahrscheinlich müssen Sie dies jedoch nicht tun.

+0

das macht Sinn, danke für Ihre Hilfe! – mattc19

+0

nicht für mich arbeiten ... exports.handler = (Ereignis, Kontext, Rückruf) => { process (Ereignis, Funktion (Antwort) { \t console.log ('Rückruf' + Antwort); Rückruf (null, antwort); }); }; Der Rückruf wird zurückgerufen, aber der Rückruf (Null, Antwort) tut nichts – dang