@Fox Привет.Я описывал задачу в этой теме https://community.bablosoft.com/topic/27417/вызов-многопоточной-функции
Дело в том,что я не могу вообще никак перевести свой скрипт на многопоток,у меня тупо,что в вызове функции в многопоток,что просто обычный многопоток,выполняет свою работу с данными по очереди,а не одновременно.И это очень сильно бьет по времени,а нужна именно скорость обработки.Все уже готово и скрипт рабочий полностью,но скорость обработки заставила воспользоваться многопотоком.Ранее,подобных проблем не замечал,а сейчас элементарную задачу не могу уже несколько дней решить.
Скрипт очень простой и работает без браузера вообще,в скрипте используется только одно взаимодействие с гет запросом.Пример скрипта я приложил в этой теме(но без запросов),он точно почти такой же,как и основа.
Логика такова:
1)Запускается скрипт (без всяких ресурсов изначально и данных) и создаются два ресурса.
2)Делается запрос на сайт,который обрабатывается в отдельной функции,т.е. обрабатывает полученные строки и записывает в ресурс.
3)Вызывается функция в несколько потоков,которая работает (должна работать) с каждой строкой из созданного ранее ресурса(уникальной)в отдельном потоке.Данные обрабатываются и записываются во второй ранее созданный ресурс.
4)Как только данные обработаны,ресурс переводится в список и список записывается в файл.Более ничего не делается.
-Сперва я думал,что проблема в создаваемых в ходе работы ресурсах,но нет.Создавал изначально ресурсы и то же самое было.
-Потом пробовал брать из файлов значения\потом создавать файлы по ходу и из них брать данные\сохранять напрямую пытался и.т.д
-Возможно думал стоят какие то ограничения из за слабого пк с 4 гб оперативы и взял сервер с 64 гб,но как обрабатывалась строка за 5 минут на моем пк,так же по скорости и на серваке.Ладно, с этим я уже ничего не поделаю из за регулярок в проекте,согласен.Но вот перевести на поток и хотя бы по 10 строк одновременно обрабатывать,очень бы помогло.А сейчас в любом случае,у меня,сколько бы потоков не выставил - работает все равно как один,просто по очереди разный поток берет свои данные(
Кубик Яваскрипт - запись данных в переменную БАС
-
Как реализовать, подскажите? Обычным образом как в блоке "Выполнить код" - не работает.
[[THE_NAME]] = 'test'
-
@centerdevs said in Кубик Яваскрипт - запись данных в переменную БАС:
Как реализовать, подскажите? Обычным образом как в блоке "Выполнить код" - не работает.
[[THE_NAME]] = 'test'
Должно работать, что у вас за js код?
-
let open = XMLHttpRequest.prototype.open; // Overwrite the native method XMLHttpRequest.prototype.open = function() { // Assign an event listener this.addEventListener("load", function(){ document.getElementById("demo3").innerHTML = 'some value'; [[ANAME]] = 'some value'; }, false); // Call the stored reference to the native method open.apply(this, arguments); };В итоге ANAME равен null. Естественно само событие я вызываю в браузере совершая ajax запрос, и убеждаюсь что всё прошло успешно по innerHTML
-
@centerdevs said in Кубик Яваскрипт - запись данных в переменную БАС:
let open = XMLHttpRequest.prototype.open; // Overwrite the native method XMLHttpRequest.prototype.open = function() { // Assign an event listener this.addEventListener("load", function(){ document.getElementById("demo3").innerHTML = 'some value'; [[ANAME]] = 'some value'; }, false); // Call the stored reference to the native method open.apply(this, arguments); };В итоге ANAME равен null. Естественно само событие я вызываю в браузере совершая ajax запрос, и убеждаюсь что всё прошло успешно по innerHTML
Добавьте ожидание через await
-
@centerdevs said in Кубик Яваскрипт - запись данных в переменную БАС:
SyntaxError: await is only valid in async functionА подскажите куда именно async распихать надо чтобы заработало? Добавляю в начале функций - не помогает.
Так, погодите, вы переопределяете метод open, вешаете обработчик и вызываете функцию. Зачем вы в обработчик помещаете этот код?:
document.getElementById("demo3").innerHTML = 'some value'; [[ANAME]] = 'some value';Судя по всему вы используете скрипт для прослушивания событий AJAX на глобальном уровне
https://www.tutorialclues.com/topics/javascript/examples/listening-to-ajax-events-at-a-global-level// Store a reference to the native method let open = XMLHttpRequest.prototype.open; // Overwrite the native method XMLHttpRequest.prototype.open = function() { // Assign an event listener this.addEventListener("load", event => console.log(XHR), false); // Call the stored reference to the native method open.apply(this, arguments); };Но к чему тогда изменять значение элемента по id? Какой результат вы хотите достичь?
-
@Fox Это просто для себя для отладки) Чтобы явно понимать когда событие отработало, так как запись в переменную мне пока что не далась.
По самому скрипту и его назначению, всё правильно поняли. Я хочу ловить все события ajax в документе, и по окончанию загрузки записывать в переменные инфу.
-
@centerdevs said in Кубик Яваскрипт - запись данных в переменную БАС:
@Fox Это просто для себя для отладки) Чтобы явно понимать когда событие отработало, так как запись в переменную мне пока что не далась.
По самому скрипту и его назначению, всё правильно поняли. Я хочу ловить все события ajax в документе, и по окончанию загрузки записывать в переменные инфу.
Эмм.. Вы же понимаете, что такое "обработчик событий"? Смотрите, ваш код при каждом ajax запросе регистрирует обработчик события "load", это событие происходит, когда ресурс завершил загрузку. При этом вы устанавливаете статичный способ проверки, то есть если, скажем сайт отправит 10 ajax запросов, то как только вернётся хотя бы один, то код
document.getElementById("demo3").innerHTML = 'some value';сработает и вы уведите изменение. При этом остальные запросы могут висеть или завершится ошибкой.
Я бы посоветовал использовать счётчик, сколько отправлено и сколько завершено запросов.
Судя по вашим сообщениям в других темах, я так понимаю вы хотите создать универсальный инструмент ожидания загрузки страницы? В таком случае есть несколько моментов.
Во первых почему именно ajax? Страница может загружать компоненты разными способами, ваш код не сработает если, например, загрузку компонентов прописали тегами и коде в html
<script type="тип" src="URL"></script>также ajax запросы могут быть созданы без использования метода XMLHttpRequest, например через fetch
fetch( 'http://domain/service', { method: 'GET' } ) .then( response => response.json() ) .then( json => console.log(json) ) .catch( error => console.error('error:', error) ); -
@Fox Всё верно на счёт задачи ( универсальный инструмент ожидания загрузки страницы ), а на счёт множества запросов... именно счётчик и планировал делать, а кидал в том виде просто как пример) На данный момент вижу более менее стабильную работу, за исключением ajax. А теперь оказалось что и fetch.
Но уже глягул, можно так же "вклиниться" во все fetch запросы с помощью такого
var oldFetch = fetch; // must be on the global scope fetch = function(url, options) { var promise = oldFetch(url, options); // Do something with the promise return promise; }Вопрос с тем как прописывать в БАС переменные из этого кода еще не решил
-
@centerdevs said in Кубик Яваскрипт - запись данных в переменную БАС:
@Fox Всё верно на счёт задачи ( универсальный инструмент ожидания загрузки страницы ), а на счёт множества запросов... именно счётчик и планировал делать, а кидал в том виде просто как пример) На данный момент вижу более менее стабильную работу, за исключением ajax. А теперь оказалось что и fetch.
Но уже глягул, можно так же "вклиниться" во все fetch запросы с помощью такого
var oldFetch = fetch; // must be on the global scope fetch = function(url, options) { var promise = oldFetch(url, options); // Do something with the promise return promise; }Опять же, вы умеете работать с промисами? Плюс учтите, что вам это всё нужно использовать до загрузки страницы через действие "Выполнять при каждой загрузке страницы в браузере".
Только всё это один фиг не поможет, данные можно загружать и через вебсокеты, или, например фреймы
<iframe src="URL">...</iframe>Тут важно понимать конечную цель, что вы хотите сделать в итоге (в идеале)? Для чего?
Определение "универсальный инструмент ожидания загрузки страницы" слишком расплывчатое, например при переходе на сайт видео-хостинга, нужно ли ждать завершения загрузки всего ролика до конца? Далеко не все мультимедиа компоненты являются обязательными для работы с сайтом.
Или сайты с кучей рекламы, вы наверняка такие встречали, которые крутят рекламу по кругу, они ни когда не загрузятся до конца. -
@centerdevs , может зарелизишь, как лайфхак. Возможно, кто-то ещё от себя добавит что-то в код.
-
@Fox С промисами умею работать совсем не много, но есть гугл и не должно быть проблемой. Конечная цель - получить более адекватный и быстрый ожидатель загрузки) Он не будет панацеей во всех случаях, но как минимум 99% моих требований закроет + будет иметь доп настройки чтобы можно было его немного подправлять в особых ситуациях.
"Выполнять при каждой загрузке страницы в браузере" - естественно! :) Всё уже проверил, событие ловит)
На счёт видео, скриптов и прочего - это уже частные случаи которые будут обрабатываться в частном порядке или настройками функции ожидателя.
-
@centerdevs said in Кубик Яваскрипт - запись данных в переменную БАС:
@Fox С промисами умею работать совсем не много, но есть гугл и не должно быть проблемой. Конечная цель - получить более адекватный и быстрый ожидатель загрузки) Он не будет панацеей во всех случаях, но как минимум 99% моих требований закроет + будет иметь доп настройки чтобы можно было его немного подправлять в особых ситуациях.
"Выполнять при каждой загрузке страницы в браузере" - естественно! :) Всё уже проверил, событие ловит)
Все эти телодвижения уйдут лесом при простом востановлении объекта window
var i = document.createElement('iframe'); i.style.display = 'none'; document.body.appendChild(i); window = i.contentWindow; i.parentNode.removeChild(i); -
Придумал костыль на этот случай. Может кому пригодится.
Использую обьект window.
Например window.my_var_name = "blabla"
А далее в другом месте проекта с помощью кубика яваскрипт привязываю значение из window.my_var_name в переменную баса.