Я создал API с Node.js, и я не хочу, чтобы API менялся, и я не хочу добавлять дополнительные параметры к функции. Тем не менее, внутренний код в библиотеке должен теперь отправлять некоторые метаданные между внутренним методом API и внешним способом.Передача метаданных между функциями
Есть ли способ передавать (мета) данные между функциями как-то в JS, которые не включают параметры/аргументы?
TL; DR, было бы очень полезно передавать метаданные между функциями для целей JS API, которые не должны изменять подписи.
(Один трюк, если функция создается каждый раз, когда она вызывается, вы можете назначать данные непосредственно на объект функции, но это не так в этом случае (функция не создается каждый раз, когда она вызывается).)
трюк, который я использую в настоящее время, - и это не хороший - в API используется объект {}. Я передаю скрытое свойство в объекте объектов «__preParsed». Пользователь будет использовать объект объектов, как обычно, за кулисами я использую его для некоторых предметов бухгалтерского учета, о которых им не нужно знать.
Ok вот код:
// публичный API
beforeEach.cb = function (desc, opts, fn) {
const _args = pragmatik.parse(arguments, rules.hookSignature);
_args[ 1 ].cb = true;
return beforeEach.apply(ctx, _args);
};
beforeEach = function (desc, opts, aBeforeEach) {
handleSetupComplete(zuite);
const _args = pragmatik.parse(arguments, rules.hookSignature);
const obj = { //have to do this until destructuring works
desc: _args[ 0 ],
opts: _args[ 1 ],
fn: _args[ 2 ]
};
handleBadOptionsForEachHook(obj.opts, zuite);
return 'there is more code but I omitted it';
};
, как вы можете видеть, что первый метод вызывает второй, или второй можно назвать сразу, как публичные интерфейсы.
Нам нужно проанализировать аргументы в обоих вызовах, но в качестве оптимизации нам не нужно будет разбирать их второй раз, если второй метод был вызван первым, а не напрямую.
Решение, которое я буду использовать на данный момент является:
beforeEach.cb = function (desc, opts, fn) {
const _args = pragmatik.parse(arguments, rules.hookSignature);
_args[ 1 ].cb = true;
_args[ 1 ].__preParsed = true;
return beforeEach.apply(ctx, _args);
};
в OPTS варианты объекта является открытым, но пользователь не будет знать о __preParsed собственности. Внутренний API будет.
Проблема заключается в том, что пользователь может вызвать публичный API напрямую без объекта options, а так как подпись очень много varargs, то я действительно не знаю, пока не разобрал его с моим синтаксическим анализатором, который arg, если какой-либо объект объектов!
Действительно хороший, до тех пор, пока функция уже не использовать 'this' –
да, к сожалению, уже есть контекст, хотя я мог бы просто добавить скрытые свойства этой связи проблема это, я должен был бы установить и затем отключить свойство, так как это метод в этом контексте, а значение свойства относится только к времени жизни вызова метода ... Лучше передать его как параметр. –
Я собираюсь просто вывести код, чтобы было ясно, что происходит –