Почему обертывание моей библиотеки JavaScript в анонимную функцию исправило мое состояние гонки? - PullRequest
5 голосов
/ 05 октября 2011

Вопрос: Почему завершение моей библиотеки JavaScript в анонимной функции исправило мое состояние гонки?

Примечание. Меня также интересуют комментарии о хороших решениях для синхронной и асинхронной загрузки внешних ресурсов JavaScript.

Я работаю над проектом, который предполагает написание расширения для браузера с использованием кроссрайдера. Если вы не знакомы с расширениями кросс-райдера, они реализованы в JavaScript, у вас есть фоновая страница, которая может взаимодействовать со страницей приложения. Страница приложения может работать с каждой открытой вкладкой и может управлять DOM. Я планирую загрузить большую часть кода расширения удаленно, когда пользователь запрашивает его открытие. Недавно я столкнулся с состоянием гонки, когда добавил страницу скрипта на страницу , ссылающуюся на Рафаэля , а затем что-то, что я построил из граффли

Из того, что я понимаю, если страница загружается с уже установленными тегами сценария, то выполнение будет выполняться синхронно, хотя, поскольку я добавлял теги сценария, выполнение выполнялось асинхронно. Это противоположная проблема, которая возникает у большинства людей. Возникнув с этим, я узнал, что обертывание моего кода кода в анонимную функцию исправило мое состояние гонки. Зачем? Я читал этот пост о , оборачивая целые файлы Javascript в анонимные функции , и это, похоже, не имеет никакого отношения к условиям гонки.

Мой телефонный код:

var scriptsToLoad   = [ "http://example/Scripts/lib/raphael.js",
                "http://example/Scripts/lib/graffle.js",
                "http://example/Scripts/lib/log4javascript.js"];

for(var i in scriptsToLoad) {
    (function(){
        $("head")
            .append($("<script></script>")
                .attr("type", "text/javascript")
                .attr("src", scriptsToLoad[i]));
    })()
}

1 Ответ

2 голосов
/ 05 октября 2011

Что касается вашего вопроса, я не верю, что был какой-то конкретный стандартный набор для порядка, в котором теги <script /> загружаются и оцениваются; легко ввести условия гонки.

Что касается (а) синхронной загрузки скрипта, с помощью jQuery сделайте следующее:

var scriptsToLoad = [
    "http://example/Scripts/lib/raphael.js",
    "http://example/Scripts/lib/graffle.js",
    "http://example/Scripts/lib/log4javascript.js"
];

$.each(scriptsToLoad, function (index, script) {
    $.ajax({
        url      : script,
        async    : false,
        dataType : 'script'
    });
});
...