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

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

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

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


Дополнительная информация о том, к чему я стремился достичь

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

Предположим, что у нас есть script '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

Один из связанных вопросов, связанных с установкой 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');
});