RequireJS определяет условия гонки браузера - PullRequest
2 голосов
/ 21 марта 2012

У нас есть плагин на стороне клиента, который состоит из модулей (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');

У меня такие вопросы: я что-то упустил, что уже там?Существует ли существующий шаблон, который я не знаю, чтобы справиться с этим конкретным случаем?Это вообще плохая идея?

1 Ответ

0 голосов
/ 19 декабря 2012

Если возможно, убедитесь, что клиент помещает requireJS и все зависимости в head . ' Me ' может включать вызов по требованию , который выполняется при создании, если это невозможно.

...