У меня есть веб-приложение на основе apache. php, js и jquery. Все работает нормально.Лучшая практика для контекстного режима во время выполнения в JS
На стороне клиента есть небольшая библиотека в JS/jquery, предлагающая некоторые общие методы обработки списков. Раньше я использовал обратные вызовы для обработки тех немногих проблем, в которых эти методы должны были вести себя несколько иначе. Таким образом, я могу повторно использовать такие методы, как обработка списков, обработка диалоговых окон и прочее для разных частей приложения. Однако в последнее время число обратных вызовов, которые мне пришлось передать при входе в библиотеку, выросло, и я пытаюсь провести редизайн:
Вместо указания всех обратных вызовов как аргументов функции я создал в библиотеке объект центрального каталога. Каждый модуль приложения регистрирует свой собственный вариант обратных вызовов в этот каталог при инициализации. Во время выполнения методы ищут требуемые обратные вызовы в этом каталоге, а не ожидая, что они указаны в их списке аргументов. Это очень многое очищает.
Однако у меня есть одна вещь, от которой я до сих пор не могу избавиться: мне нужен один аргумент (я называю его контекстом, режим может быть другим термином), который используется методами для поиска требуемого обратного вызова в каталоге. Этот контекст должен быть передан всем методам. Конечно, лучше, чем всевозможные обратные вызовы, которые указаны везде, но мне интересно, могу ли я избавиться от этого последнего. Но где указать этот контекст, если не как аргумент метода? Я довольно новичок в JS и jquery, поэтому мне не удалось найти подход к этому. По-видимому, я не хочу использовать глобальные вары, и, честно говоря, я сомневаюсь, что я могу просто сохранить контекст в одной переменной в любом случае, поскольку из-за всех обработчиков событий и методов внешних влияний можно было бы вызывать в разных контекстах при одном и том же времени или, по крайней мере, чередования. Поэтому я думаю, мне нужно что-то ближе к стеке функций. Может быть, я могу просто подтолкнуть объект контекста к стеку и прочитать его в пределах слоев библиотеки, которые нужно знать? Объект будет удален, когда я снова покину библиотеку. Конечно, существуют и другие подходы.
Вот так много опытных кодеров, которые, безусловно, могут дать новичку, как короткий намек, отправную точку, которая приводит к идее, как реализовать это. Как такая вещь обычно делается?
Я пробовал некоторое время, исследуя иерархию arguments.callee.caller
. Я подумал, что, возможно, я могу установить элемент-прототип внутри вызывающей функции, а затем, когда шаги выполнения дальше вниз, я могу просто пройти стек вызовов вверх до тех пор, пока не найду вызывающий объект с таким свойством и не использую это значение в качестве контекста. Однако я также видел текущие дискуссии, которые показывают две вещи: 1.) arguments.callee
, по-видимому, обесценивается и 2.) кажется, действительно дорогим. Так что это не выход.
Я также читал об альтернативе Function.caller (который появляется не амортизироваться и гораздо более эффективным, однако до сих пор я не смог изучить этот след ...
Как написано в настоящее время проходит контекст/режим просто работает, указывая дополнительный аргумент в вызовах функций. Он несет уникальную строку, которая используется в качестве ключа при обращении к каталогу. Так что что-то вроде этого (не скопировано, а написано как примерный пример):
<!-- callbacks -->
callback_inner_task_base:function(arg1,arg2){
// do something with args
}
callback_inner_task_spec:function(arg1,arg2){
// do something with args
}
<!-- catalog -->
Catalog.Callback:function(context,slot){
// some plausibility checks...
return Catalog[context][slot];
}
Catalog.base.slot=callback_inner_task_base;
Catalog.spec.slot=callback_inner_task_spec;
<!-- callee -->
do_something:function(arg1,arg2,context){
...
// callback as taken from the catalog
Catalog.Callback(callback,'inner_task')(arg1,arg2);
...
}
<!-- caller -->
init:function(...){
...
do_something('thing-1',thing-2','base');
do_something('thing-1',thing-2','spec');
...
}
У вас есть небольшой пример кода? – elmuchacho
@elmuchacho Хм, это непросто. Дело в том, что с открытым исходным кодом, но просто дает вам URL-адрес репозитория кода, это не поможет, код распространяется на слишком много файлов. Я не вижу, как я могу легко отфильтровать небольшой, но значимый пример из этого материала ... Вот почему я попытался задать вопрос более подробно, пытаясь поместить вещи в общую форму. Есть ли какие-то конкретные детали, на которые вы хотите взглянуть? – arkascha
@arkascha Затем покажите пример того, как этот контекст передается в одном простом случае? –