Как инициализировать вложенную функцию или класс один раз для 2х файлов
можно ли как-то обыграть этот момент, когда мне необходимо использовать запущенный класс/вложенную_функцию (ClassOrNestedFunction) в двух разных файлах, но с одной инициализацией? Т.е. чтобы аутпут от getStartTime был одинаковый
Пример
// FILE_0
const ClassOrNestedFunction = async()=>{
await sleep(1000);
let time = new Date().getTime();
return {getStartTime: ()=>time};
};
// export for ClassOrNestedFunction
// FILE_1
// import ClassOrNestedFunction from FILE_0
const {getStartTime} = await ClassOrNestedFunction();
console.log(getStartTime()); // unixtime_1
// FILE_2
// import ClassOrNestedFunction from FILE_0
const {getStartTime} = await ClassOrNestedFunction();
console.log(getStartTime()); // unixtime_not1
Знаю, что можно просто прокинуть ClassOrNestedFunction внутри FILE_1 когда он запускает FILE_2
Т.е. вот так:
// FILE_1
// import ClassOrNestedFunction from FILE_0
// import file2 from FILE_2
const ClassOrNestedFunctionInited = await ClassOrNestedFunction();
const {getStartTime} = ClassOrNestedFunctionInited;
console.log(getStartTime()); // unixtime_1
// ...
file2(ClassOrNestedFunctionInited);
Ответы (1 шт):
Короче несколько путей решения:
1
nörbörnën say: export ClassOrNestedFunction() экспортируйте результат вызова функции; а если класс - создайте инстанс класса и экспортируйте его
(Не уверен, могу ошибаться, что запущенная функция попадет)
2
chatgpt подсказал решение через: const cacheManager = require('cache-manager');, но этот кейс работает максимум с объектами, а когда у тебя какой-нибудь большой инстанс там запущен и живет, то этот вариант не подходит
3
Есть вариант реализации через глобальную переменную, но этот кейс (так же как и первый) не подходит конкретно для лямбды, потому что запущенный инстанс чего-то большого передается меж всех тасков/инстансев лямбды
а так же вернемся ко 2му варианту - большой инстанс можно передавать, и конечно это ускорит выполнение последующих лямбд, но этот большой инстанс может в себе кучу всего содержать и непонятно как поведет себя его содержимое, ибо логика нацелена на то, что будет чистый код, чистые параметры в ClassOrNestedFunction..
4
Ну и самый банальный и простой способ, который я выбрал и сразу к нему шёл: запускать функцию внутри хендлера - чтобы она не попадала в глобалки, а затем передавать её как аргумент во вложенные файлы
Примерный код такой:
// import file2;
import ClassOrNestedFunction from './ClassOrNestedFunction.js';
export const handler = async(event, context)=>{
const active_ClassOrNestedFunction = await ClassOrNestedFunction();
const {getStartTime} = active_ClassOrNestedFunction;
console.log(getStartTime());
const output = await file2.someFunctionInside(event, context, active_ClassOrNestedFunction).catch((e)=>false);
return output || null;
};