J'utilise xmlhttprequest
(et eval
) pour charger dynamiquement des scripts. Ensuite, j'évalue le script et je recherche s'il y a d'autres scripts à charger. Dans le cas où l'un des scripts cause et fait exception, le message d'erreur signalé indique le numéro de ligne associé à eval
, et non l'erreur réelle dans le script.
Sur une autre question, il m'a été suggéré d'utiliser <script>
pour améliorer les messages d'erreur. Malheureusement, <script>
est asynchrone, et je ne pourrai pas contrôler l'ordre de chargement des scripts (j'ai besoin d'un rappel en charge).
Comment puis-je implémenter un comportement synchrone dans les commandes <script>
Plus d'informations sur ce que je souhaite atteindre
Chaque script possède une liste d'autres scripts qu'il charge, stockés dans une liste, on l'appelle _toLoad
Disons que nous avons un script 'Main.js' avec une liste de charge comme
_toLoad = [['A.js'] , ['B.js'] , ['C.js'] , ['D.js' , 'E.js' , 'F.js']]
Ce qui indique qu'une fois chargé, le fichier 'A.js' doit être chargé à la suite. Une fois 'A.js' chargé, 'B.js' doit être chargé ensuite. Une fois 'B.js' chargé, 'C.js' doit être chargé à la suite. Une fois que 'C.js' est chargé, 'D.js', 'E.js' et 'F.js' doivent être chargés, dans n'importe quel ordre.
Je pourrais utiliser <script>
pour charger 'Main.js', évaluer sa liste _toLoad
et commencer à charger les autres scripts, dans le bon ordre. Mais que se passe-t-il si 'A.js' a plusieurs scripts, il charge aussi? Je veux que ceux qui le chargent en arrière-plan, et ne pas retarder 'B.js' de chargement
Que faire si 'A.js' a une liste de charge comme ça:
_toLoad = [['A2.js'] , ['B2.js'] , ['C2.js'] , ['D2.js' , 'E2.js' , 'F2.js']]
Est-ce que je devrais passer et publier des instructions <script>
pour ceux-ci. Cela semble être une première approche en profondeur, quand je veux d'abord une forme de largeur.
Une des questions liées a mentionné la définition de innerHTML de l'élément de l'étiquette de script. Je pense que cela pourrait faire l'affaire
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'); });