1080 / 1007 / 107
Регистрация: 28.02.2010
Сообщений: 2,889

Очередь XML запросов

28.01.2012, 18:26. Показов 1568. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе время суток.
Задача: выполнить очередь XML запросов, причем так, чтобы страница была доступна для "кликания" во время выполнения этих запросов.

Прочитал что такое XMLHttpRequest, понял чем отличается синхронный запрос от асинхронного.

Схема такая:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function asyncHandler()
{
    if (this.readyState != 4)
        return;
    
    if (this.status == 200)
    {
        writeResult(this.responseXML);
    }
}
 
function runXMLRequest(link)
{
    requestLink = 'controller.php?' + link;
    xmlhttp = new XMLHttpRequest();
    xmlhttp.open("GET", requestLink, true);
    xmlhttp.onreadystatechange = asyncHandler;
    xmlhttp.send();
}
В другом файле:
JavaScript
1
2
3
4
for (var i in linkArray)
{
    runXMLRequest(linkArray[i]);
}
linkArray - это массив из 58 элементов. Т.е. 58 запросов нужно выполнить.

Но в данном случае скрипт пытается выполнить сразу одновременно 58 запросов. Это не то что нужно. Нужна очередь.
Если использовать синхронные запросы, то очередь получается, но страница не доступна для кликания.

Вопрос: как реализовать очередь асинхронных XML запросов?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.01.2012, 18:26
Ответы с готовыми решениями:

Promise, два ajax запроса, задать очередь выполнения запросов, цепочка promise
Добрый день, уважаемые форумчане! Помогите разобраться с цепочкой promise. Суть проблемы: Есть 3 метода: 2 ajax get запроса и 1...

Очередь запросов
Здравствуйте, форумчане. Такой вопрос.. Есть софтина, которая обращается к апи одно сервиса, из месяца в месяц обрастала функционалом,...

Очередь отправки get-запросов
Есть get запрос: http://158.4581/sad.php?id=&auth= И есть содержимое в richTextBox1 такого типа: ...

2
Просто любитель
 Аватар для GuardCat
626 / 464 / 120
Регистрация: 20.01.2011
Сообщений: 865
Записей в блоге: 2
28.01.2012, 19:44
Используйте t = setInterval(yourFunction, 100).
t --- глобальная переменная. Внутри функции используете счётчик, делаете запрос, если нужное число запросов выполнено, делаете clearInterval(t).
100 (одна десятая секунды) выбрано от балды. Можно использовать 10, например.
1
1080 / 1007 / 107
Регистрация: 28.02.2010
Сообщений: 2,889
01.02.2012, 11:05  [ТС]
Собственно асинхронную очередь я реализовал (без таймеров):
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
var link_index = 0;
 
function writeResult(xmlDoc)
{
    forumtitle = xmlDoc.getElementsByTagName("forumtitle")[0].childNodes[0].nodeValue;
    titles = xmlDoc.getElementsByTagName("title");
    links = xmlDoc.getElementsByTagName("link");
    len = titles.length;
    
    if (len == 0) return;
    
    document.write('<h1>' + forumtitle + '</h1>');
    for (i=0;i<len;i++)
    {
        link = links[i].childNodes[0].nodeValue;
        title = titles[i].childNodes[0].nodeValue;
        document.write('<a target="_blank" href="' + link + '">' + title + '</a><br>');
    }
}
 
function asyncHandler()
{
    if (this.readyState != 4)
        return;
    
    if (this.status == 200)
    {
        writeResult(this.responseXML);
        link_index++;
        runXMLRequest();
    }
}
 
function runXMLRequest()
{
    if (link_index>=linkArray.length)
        return;
    
    link = linkArray[link_index];
    requestLink = 'controller.php?' + link;
    xmlhttp = new XMLHttpRequest();
    xmlhttp.open("GET", requestLink, true);
    xmlhttp.onreadystatechange = asyncHandler;
    xmlhttp.send();
}
 
// .....
 
runXMLRequest();
Но работает не как хотелось бы. Появилась другая проблема.
Вообщем я смотрю на консоль (вроде так называется) Firebug. Смотрю что последовательно выполняются запросы. После каждого запроса выполняется writeResults().
- Если len равен нулю, то ничего не записывается (это нормально).
- Если len НЕ равен нулю, то записывается результат (document.write). А дальше необычное.
После document.write консоль очищается (до этого был список выполненных запросов) и через пару секунд появляется очередной запрос, который успешно выполнен (200 OK) и список обнаруженных ошибок:
attempt to run compile-and-go script on a cleared scope
if (this.readyState != 4)
Причем 3 штуки и ссылаются на одну строку.
И следующие запросы не выполняются.

Как с этим быть?

Добавлено через 44 минуты
Последнюю проблему решил. Вместо document.write просто добавлял новые элементы через document.createElement
Окончательный код:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
var link_index = 0;
var body = document.getElementById('body_id');
 
function addElement(content)
{
    newspan = document.createElement('span');
    newspan.innerHTML = content;
    body.appendChild(newspan);
}
 
function writeResult(xmlDoc)
{
    forumtitle = xmlDoc.getElementsByTagName("forumtitle")[0].childNodes[0].nodeValue;
    titles = xmlDoc.getElementsByTagName("title");
    links = xmlDoc.getElementsByTagName("link");
    len = titles.length;
    
    if (len == 0) return;
    
    content = '';
    
    content += '<h1>' + forumtitle + '</h1>';
    
    for (i=0;i<len;i++)
    {
        link = links[i].childNodes[0].nodeValue;
        title = titles[i].childNodes[0].nodeValue;
        content += '<a target="_blank" href="' + link + '">' + title + '</a><br>';
    }
    
    addElement(content);
}
 
function asyncHandler()
{
    if (this.readyState != 4)
        return;
    
    if (this.status == 200)
    {
        writeResult(this.responseXML);
        link_index++;
        runXMLRequest();
    }
}
 
function runXMLRequest()
{
    if (link_index>=linkArray.length)
        return;
    
    link = linkArray[link_index];
    requestLink = 'controller.php?' + link;
    
    xmlhttp = new XMLHttpRequest();
    xmlhttp.open("GET", requestLink, true);
    xmlhttp.onreadystatechange = asyncHandler;
    xmlhttp.send();
}
 
var linkArray = new Array();
 
// linkArray = [...]
 
runXMLRequest();
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.02.2012, 11:05
Помогаю со студенческими работами здесь

Очередь запросов и их выполнение
Привет, есть метод вида void task(int number), и к нему делаются асинхронные запросы, но из-за свой особенности он не асинхронный и сделать...

Flask. Очередь запросов. Файлы. Конфликт w/r
Имеется веб страничка на Flask. На страничке SVG изображение - переключатель. При клике на ВКЛ, отправляется запрос, который на сервере...

Разработка модели обследования запросов (процессов) с использованием дисциплины, типа Очередь
Разработка модели обследования запросов (процессов) с помощью дисциплины, типа Очередь

Очередь выполнения множества запросов и рано или поздно наступающий StackOverflow
Вообщем имеется очередь выполнения: в очередь кладется команда (например, выполнение sql запроса) и потом в 1 потоке выполняются все...

Web api Управлять очередью запросов динамически (длиной) и как получить url поступившего в очередь запроса
Я так понимаю, что все запросы приходят в HTTP.Sys откуда запрос в виде HTTP.Context поступает на web api. И все параметры HTTP.Sys нужно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

Новые блоги и статьи
Настройка записи справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru