Синхронные <script>заявления? - PullRequest
       6

Синхронные <script>заявления?

0 голосов
/ 24 октября 2011

Я использую xmlhttprequesteval) для динамической загрузки скриптов. Затем я оцениваю скрипт и смотрю, есть ли другие скрипты для загрузки. По пути, если какой-либо из сценариев вызывает и вызывает исключение, в сообщении об ошибке указывается номер строки, связанный с eval, а не с фактической ошибкой в ​​сценарии.

На другой вопрос было предложено использовать <script> вместо этого, чтобы получить лучшие сообщения об ошибках. К сожалению, <script> является асинхронным, и я не смогу контролировать порядок загрузки скриптов (мне нужен обратный вызов onload).

Как реализовать синхронное поведение в <script> командах


Еще немного информации о том, чего я хочу достичь

Каждый скрипт имеет список других скриптов, которые он загружает, хранится в списке, давайте назовем его _toLoad

Допустим, у нас есть скрипт 'Main.js' со списком загрузки, например

_toLoad = [['A.js'] , ['B.js'] , ['C.js'] , ['D.js' , 'E.js' , 'F.js']]

В котором указано, что после загрузки файл 'A.js' должен быть загружен следующим. Как только «A.js» загружен, «B.js» должен быть загружен следующим. Как только «B.js» загружен, «C.js» должен быть загружен следующим. После загрузки «C.js» необходимо загрузить «D.js», «E.js» и «F.js» в любом порядке.

Я мог бы использовать <script>, чтобы загрузить 'Main.js', оценить его список _toLoad и начать загружать другие скрипты в правильном порядке. Но что произойдет, если у «A.js» есть несколько скриптов, которые он также загружает? Я хочу, чтобы они загружались в фоновом режиме, а не задерживали загрузку B.js

Что если у 'A.js' есть список загрузки, например:

_toLoad = [['A2.js'] , ['B2.js'] , ['C2.js'] , ['D2.js' , 'E2.js' , 'F2.js']]

Если бы мне пришлось пройти и выпустить <script> заявления для тех. Это похоже на глубинный подход, когда я сначала хочу форму широты.

1 Ответ

1 голос
/ 24 октября 2011

В одном из связанных вопросов упоминается установка innerHTML элемента тега script. Я думаю, что это может сделать трюк

function load(toEval, callback){
    __global_callback = callback;

    var node = document.createElement('script');
    node.innerHTML = toEval + '; __global_callback()';
    document.getElementsByTagName('head')[0].appendChild(node);
}

load("console.log('before...');", function(){
    console.log('...and after');
});
...