#javascript #asynchronous #webpack
#javascript #асинхронный #webpack
Вопрос:
Я получаю build.js сгенерирован с помощью webpack из другого отдела. Я включаю его в HTML-файл с
<script type="module" src="build.js"></script>
Но там есть ряд асинхронных запросов и переменных, к которым мне нужно получить доступ. Я не могу получить к ним доступ, пока build.js полностью загружен. Как я могу проверить, когда он был загружен?
Комментарии:
1.
load
Событие в окне должно гарантировать, что этот файл загружен. Это не обязательно гарантирует что-либо о состоянии (или существовании) какой-либо асинхронной логики в самом файле.2. @Taplar Я думаю, что вопрос заключается не только в загрузке js-файла, но и в загрузке некоторых сторонних ресурсов через запросы, отправляемые кодом в этом файле.
3.
<script>
является html-тегом, а src в нем является*.js
файлом. Я не уверен, как это можно перепутать с тем, что делает пользователь. @LajosArpad4. @Taplar пользователь не ожидает загрузки скрипта. Он ожидает завершения асинхронных запросов скрипта, поскольку в вопросе четко указано: «Но там есть ряд асинхронных запросов и переменных, к которым мне нужно получить доступ». Вопрос в конце вводит в заблуждение «Как я могу проверить, когда он был загружен?», что, на мой взгляд, является причиной неправильного понимания вопроса. Что на самом деле запрашивающий имеет в виду под «полностью загруженным» AFAIK, так это то, что все асинхронные запросы, отправленные из build.js были успешно завершены.
Ответ №1:
Если build.js ваш код и вам удобно его редактировать, тогда вы могли бы создать обещание, которое автоматически выполнялось бы при завершении асинхронных задач. Вы также можете использовать несколько обещаний и вызвать all, чтобы убедиться, что все ваши переменные на месте.
Пример для Promise.all
, взятый из документации:
const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'foo');
});
Promise.all([promise1, promise2, promise3]).then((values) => {
console.log(values);
});
// expected output: Array [3, 42, "foo"]
Если build.js это не то, что вам удобно модифицировать, тогда вы могли бы прочитать это или его документацию и выяснить, есть ли четный хук для события, когда его загрузка завершена.
Если все остальное не удается, то вы можете использовать setInterval
для повторной проверки всех необходимых вам ресурсов и, как только они будут найдены, выполнить необходимые операции вместе с clearInterval
, чтобы остановить повторную проверку для них.