Необработанный отказ от обещания, несмотря на попытку поймать AWS Lambda с Node12.x - PullRequest
1 голос
/ 09 марта 2020

У меня есть список обещаний, вызывающих другие AWS Лямбды из AWS Лямбда:

promiseArray.push(lambda.invoke(params).promise())

В другой функции я повторяю эти обещания и пытаюсь разрешить их:

for (let i = 0; i < promiseArray.length; i++) {
    try {
        let result = await promiseArray[i];
        console.log("Success!");
    } catch (e) {
        console.log("Failed!");
    }
}

Вот проблема, с которой я сталкиваюсь. Часто в вызове генерируется ошибка TimeoutError, которая не перехватывается блоком try-catch и завершает выполнение Lambda, выдавая ошибку «Unhandled Promise Rejection». Обратите внимание, что это начало появляться только после того, как мы обновились с узла 8.10 до 12.x на Lambda.

1 Ответ

1 голос
/ 09 марта 2020

Проблема заключается в том, что обещания выполняются сразу после их создания, а не когда они ожидаются.

Из документации Promise :

Функция executor выполняется немедленно реализацией Promise, передавая функции разрешения и отклонения (исполнитель вызывается до того, как конструктор Promise даже возвращает созданный объект)

Учитывая, что вы используете пользовательскую 1 секунду Тайм-аут, я бы сказал, что некоторые из этих обещаний не выполняются даже до того, как вы дойдете до своего l oop, чтобы ждать их, где у вас есть блок try-catch.

Чтобы выполнить только обещания в этом try-catch Блок, вы можете немного изменить свой код, чтобы не создавать обещание раньше, а только в l oop. Что-то вроде этого:

for (let i = 0; i < params.length; i++) {
    try {
        let result = await lambda.invoke(params[i]).promise();
        console.log("Success!");
    } catch (e) {
        console.log("Failed!");
    }
}
...