Re[3]: Загрузка и выполнение скрипта2 из скрипта1 перед сриптом3
От: bnk СССР http://unmanagedvisio.com/
Дата: 10.08.25 13:11
Оценка:
Здравствуйте, rFLY, Вы писали:

bnk>>Я в таких случаях теперь просто звоню Слоу спрашиваю Клода


bnk>>https://claude.ai/share/a7767cfc-30a3-45a0-b197-a9fdcb91d2ea

FLY>

FLY>Unfortunately, Claude is only available in certain regions right now.


FLY>PS: На счет ИИ. Когда я гуглил решение этого вопроса, мне в разделе "Обзор от ИИ" были предложены варианты, которые я уже пробовал и написал здесь (т.е. не рабочие). Но это уже тема для отдельного форума.


Извиняюсь, я думал share links работают. Скопировал сюда. По виду вроде норм.
  вот
Проблема, с которой вы столкнулись, связана с тем, что скрипты, добавленные динамически через `createElement`, выполняются асинхронно, даже при установке `async = false`. Это поведение отличается от статически объявленных скриптов в HTML.

Вот несколько способов решения этой задачи:

## Способ 1: Использование `async = false` с правильным порядком

```javascript
// script1.js
let script2 = document.createElement("script");
script2.src = "script2.js";
script2.async = false; // Важно для сохранения порядка выполнения

// Добавляем скрипт ПЕРЕД script3.js в DOM
let script3 = document.querySelector('script[src="script3.js"]');
document.head.insertBefore(script2, script3);
```

## Способ 2: Удаление и повторная вставка script3.js

```javascript
// script1.js
let script3 = document.querySelector('script[src="script3.js"]');
let script3Parent = script3.parentNode;

// Удаляем script3 из DOM
script3.remove();

// Создаем и добавляем script2
let script2 = document.createElement("script");
script2.src = "script2.js";
script2.async = false;
document.head.appendChild(script2);

// После загрузки script2, добавляем script3 обратно
script2.onload = function() {
    let newScript3 = document.createElement("script");
    newScript3.src = "script3.js";
    newScript3.async = false;
    script3Parent.appendChild(newScript3);
};
```

## Способ 3: Загрузка через fetch и eval (не рекомендуется)

```javascript
// script1.js
fetch('script2.js')
    .then(response => response.text())
    .then(code => {
        eval(code); // Выполняем код синхронно
        // script2.js уже выполнен, script3.js выполнится следующим
    });
```

## Способ 4: Использование модулей (современный подход)

Если возможно изменить архитектуру, рассмотрите использование ES6 модулей:

```html
<!DOCTYPE html>
<html>
   <head>
      <script type="module" src="script1.js"></script>
   </head>
   <body>
   </body>
</html>
```

```javascript
// script1.js
import './script2.js';
import './script3.js'; // Будет выполнен после script2.js
```

## Рекомендация

Наиболее надежным решением будет **Способ 2**, так как он гарантирует правильный порядок выполнения. Способ 1 может не работать во всех браузерах из-за особенностей обработки динамически добавленных скриптов.

Также стоит отметить, что в вашем HTML есть опечатка: должно быть `src=` вместо `scr=` в тегах script.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.