Как обернуть javascript лямбда-обработчик функции? - PullRequest
1 голос
/ 01 февраля 2020

У меня есть несколько лямбда-функций, написанных на Javascript. Можно ли как-нибудь обернуть эти функции обработчика, чтобы выполнить какой-то общий код регистрации?

// handlers.js
export const emailHandler = (event, context, callback) => {
   email();
}

export const loginHandler = (event, context, callback) => {
   login();
}

Примерно так:

// genericHandler.js
export const genericHandler => (event, context, callback) => {
   console.log('Event', event);
   // How can I also make this work for login handler?
   return emailHandler(event, context, callback) 
}

Ответы [ 2 ]

1 голос
/ 01 февраля 2020

Я думаю, что решение здесь состоит в том, чтобы поместить некоторые общие логики c в пакет / функцию, которую вы можете использовать в каждом. Вы не хотите включать код для одной лямбда-функции в другую. Как можно больше вы хотите уменьшить этот размер вашего кода, чтобы холодный запуск происходил быстрее. Конечно, если ваш код маленький, это не будет большой разницей, но это немного анти-шаблонный пакет с одним и тем же кодом в нескольких функциях, и пусть код делает что-то другое в зависимости от того, как он называется.

С учетом сказанного вы всегда можете включить в свою функцию несколько точек входа, а затем передать что-нибудь, чтобы решить, что вызывать оттуда, или даже передать функцию, которую вы хотите вызвать. Вот как то так:

export const emailHandler = (event, context, callback) => {
   genericHandler(event, context, callback, email);
}

export const loginHandler = (event, context, callback) => {
   genericHandler(event, context, callback, login);
}

export const genericHandler => (event, context, callback, function) => {
   console.log('Event', event);
   // How can I also make this work for login handler?
   return function(event, context, callback) 
}

const email = (event, context, callback) => {
// email code
}

const login = (event, context, callback) => {
// login code
}

0 голосов
/ 01 февраля 2020

Вы можете передать функцию в качестве аргумента другой функции в JS. Итак,

// genericHandler.js
export const genericHandler => (called, event, context, callback) => {
   console.log('Event', event);
   // How can I also make this work for login handler?
   return called(event, context, callback) 
}

Затем замените вызовы для входа в систему обработчиком generi c.

genericHandler(emailHandler , event, context, callback);

Лучший способ - использовать прокси для каждой функции. Выезд https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy

...