У нас есть плагин на стороне клиента, который состоит из модулей (AMD) и использует require.js.В этом фреймворке мы представляем открытый объект, который состоит из свойств конфигурации и общих функциональных возможностей фреймворка.Все необходимые функции для открытого объекта содержатся в одном файле (хотя и разделены на модули);единственный файл, который требуется конечному пользователю для добавления на свою страницу.Проблема, с которой мы сталкиваемся, наиболее распространена в Safari, но иногда она проявляется и в IE, и в Chrome.100% времени в Safari с пустым кешем мы сталкиваемся с условиями гонки.Рассмотрим этот пример клиентского кода, который находится в теле страницы клиента.
<script type=”text/javascript”>
Me.subscribe(‘someEvent’, someHandler);
</script>
' Me ' всегда доступен для страницы как ее глобальный и вне любого определенного вызова.Однако ' Me.subscribe ' заключено в ' define ' и приводит к ' undefined ' с условиями, которые я изложил выше.Мы не можем сказать клиенту использовать сторонние фреймворки, чтобы обойти эту проблему.Блок кода выше должен оставаться точно таким, как есть.Я играл с идеей разрешить отложить привязку некоторых публичных функций без какой-либо дополнительной работы, требуемой клиентом.Пока что вот что я собираюсь добавить в каркас:
Me.deferred = function (fn, name) {
if (fn) return fn;
fn = this;
return function () {
var args = Array.prototype.slice.call(arguments);
setTimeout(function () {
fn[name].apply(this, args);
}, 0);
};
};
Затем, в каркасе рядом с верхом, я могу добавить элементы, которые я хочу отложить, следующим образом:
Me.subscribe = Me.deferred(Me.subscribe,'subscribe');
У меня такие вопросы: я что-то упустил, что уже там?Существует ли существующий шаблон, который я не знаю, чтобы справиться с этим конкретным случаем?Это вообще плохая идея?