|
0 / 0 / 0
Регистрация: 18.08.2016
Сообщений: 23
|
||||||||||||||||||||||||||||||||||||
Асинхронный запрос в цикле XMLHttpRequest неправильная работа04.02.2019, 01:04. Показов 4434. Ответов 7
Доброго времени суток уважаемые пользователи.
Уже 4 часа бьюсь над выполнением задания. Необходимо создать асинхронный запрос в цикле с выборкой параметров. Что делаю: 0. Создаю массив:
Что пробовал?: Менял местами пункты 1 и 2. - не помогло Пробовал использовать вместо iObject.onreadystatechange - iObject.onload - не помогло Что дальше делать ума не приложу, мозг уже дымится, прошу вашей помощи. Весь код:
0
|
||||||||||||||||||||||||||||||||||||
| 04.02.2019, 01:04 | |
|
Ответы с готовыми решениями:
7
XMLHttpRequest запрос XMLHttpRequest не отправляет запрос
|
|
24 / 18 / 9
Регистрация: 27.04.2017
Сообщений: 122
|
|
| 04.02.2019, 04:20 | |
|
Колбэки, переданные в setTimeout помещаются в специальную очередь - callback Queue (структура типа First In First Out).
Функции из этой очереди будут выполнены только после выполнения всего синхронного кода. Цикл - это синхронный код. Поэтому сначала буду выполнены все итерации цикла, и уже после этого вызовутся функции из Callback Queue.
1
|
|
|
27 / 19 / 8
Регистрация: 21.08.2018
Сообщений: 39
|
||||||
| 04.02.2019, 06:18 | ||||||
|
setTimeOut здесь роли не играет, но он всё по делу сказал.
При вызове функции run() происходит следующее: 1. Итерация цикла, в которой ты глобально объявляешь переменные iObject , http(или они уже задекларированы заранее) проделываешь необходимые присваивания и задаешь callback для onreadystatechange. 2. iObject.send(); - Асинхронно осуществляешь запрос. 3. JS не ждёт выполнения запроса, соответственно продолжает выполнять код, делает все проверки, удаляет объект iObject. Начинает следующую итерацию цикла, идём к пункту 1. Всё это происходит всего 3 раза, в этот момент все 3 асинхронных запроса уже выполнено. JS начинает эти коллбеки выполнять - все они обращаются к iObject, но он удалён. Если его не удалять каждую итерацию - он будет содержать в себе только ответ последнего запроса. И счётчик показывает тебе всегда i=3, потому что цикл весь уже выполнен. Решения: добавить для iObject.open('GET', http); третий параметр false для синхронного выполнения, тогда нужно отказаться от коллбэка и обрабатывать запрос сразу после iObject.send. Либо обернуть содержимое цикла в функцию, которая обеспечит через замыкание уникальность объекта iObject
1
|
||||||
|
640 / 481 / 172
Регистрация: 26.05.2016
Сообщений: 2,674
|
|
| 04.02.2019, 07:30 | |
|
AlexanderTravki, ну а promise никак не подойдёт? Особливо с fetch.
1
|
|
|
0 / 0 / 0
Регистрация: 18.08.2016
Сообщений: 23
|
|
| 04.02.2019, 08:00 [ТС] | |
|
Если поставить false, то код работает, я сначала так и сделал, но код подормаживает(код управляет состоянием замкнутости рэле, а пока он выполняется не вызвать onclick кнопки). Как обернуться тело цикла не совсем понятно, ведь в функции он будет выполняться также 3 раза возвращать опять же i = 3 (host[3]). Прошу прощения за глупые вопросы, видимо не до конца понимаю алгоритмически, того что получится.
0
|
|
|
2037 / 1096 / 409
Регистрация: 29.04.2016
Сообщений: 2,625
|
||||||||||||||||
| 04.02.2019, 09:30 | ||||||||||||||||
|
AlexanderTravki,
Если просто обойти все адреса в массиве и дождаться ответа то можно проще -> http://some-test.onlinewebshop.net/cycle-fetch/
1
|
||||||||||||||||
|
0 / 0 / 0
Регистрация: 18.08.2016
Сообщений: 23
|
||||||
| 05.02.2019, 01:22 [ТС] | ||||||
|
Написал вот такой код, правда еще нет кода переключающего состояния кнопок, но всё равно решил выложить на ваш суд. Сегодня после работы изучал "Promise", в одной из статей написано, что нельзя совмещать синхронный код и асинхронный (т.е. мне теперь все оборачивать промисами? вообще когда его нужно применять, а когда нет?)
Добавлено через 31 минуту Прошу прощения отправил код с ошибками Вот рабочий:
0
|
||||||
|
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
|
|||||||
| 05.02.2019, 09:57 | |||||||
|
Скрипт, который нормально мониторит ответы от 6 датчиков.
Интервал опроса выставлен в 1 секунду. Адреса датчиков нужно выставить свои.
Конец - терминальная ловушка асинхронности. Это async void метод, который в JS может быть IIFE или обработчиком события, например нажатия на кнопку. Терминальная ловушка асинхронности - практически последний шанс обработать исключение из асинхронного кода. Первоисточники из C#: Стивен Клири написал книгу по асинхронности. Тут его статья. http://www.oszone.net/21402/ Документация Microsoft по Task Asynchronous Pattern (TAP) Асинхронный шаблон, основанный на задачах (TAP)
0
|
|||||||
| 05.02.2019, 09:57 | |
|
Помогаю со студенческими работами здесь
8
Кросс-доменный XMLHttpRequest запрос
Покажите асинхронный запрос ajax Как превратить синхронный запрос, в асинхронный? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|