Я хотел бы поделиться своим решением здесь:
Допустим, у меня есть функция-обработчик лямбда-выражений, и установленный лимит времени ожидания составляет 15 минут.Внутри этой функции у меня есть асинхронная функция с именем work()
, которая может занять больше 15 минут.
Чтобы поймать ошибку тайм-аута от Lambda, я делаю так:
Я создаю новую асинхронную функцию с именем timeout()
, и эта функция просто возвращается через 14,9 минут.И я позволяю функциям work()
и timeout()
запускаться одновременно, если work()
может завершиться через 14,9 минут, то work()
возвращает раньше, чем timeout()
, в противном случае timeout()
возвращает раньше.
Выэто легче понять с помощью этой диаграммы:
И это всего лишь race()
оператор, который делает из rxjs
.
Здеськод, который реализует эту идею с помощью rxjs
:
module.exports.customTimeout = async (event) => {
function work() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('finished!');
}, 15 * 60 * 1000);
});
}
const workStream = from(work());
function timeout() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('timeout!');
}, 14.9 * 60 * 1000);
});
}
const timeoutStream = from(timeout());
const res = await new Promise((resolve, reject) => {
race(workStream, timeoutStream)
.subscribe(msg => {
resolve(msg);
})
});
return { res };
};