AsyncWait в JavaScript

Тема в разделе "Как сделать...", создана пользователем Lucid_Mind, 29 окт 2009.

Статус темы:
Закрыта.
  1. Lucid_Mind

    Lucid_Mind Постоялец

    Регистр.:
    18 янв 2009
    Сообщения:
    72
    Симпатии:
    34
    Здравствуйте!
    Пытаюсь на Ajax сделать отправку данных из input'ов, на сервер.
    Условия такие:
    1. Количество input'ов неизвестно (в данной задаче - полторы тысячи).
    2. Браузер - Internet Explorer 6-7-8, поддержка остальных браузеров не нужна.
    3. POST-запрос использовать нельзя.
    --
    Мой код:

    function Action()
    {
    isRequestBlocked = false;//Переменная, указывающая - используется ли http_request в данный момент
    var _tags = "";//Список названий переменных (не принципиально)
    var _values = "";//Список значений переменных (не принципиально)
    var _datesFrom = "";//Список дат начала периода переменных (не принципиально)
    var _datesTo = "";//Список дат окончания периода переменных (не принципиально)
    //inputNames - список ID'шников input'ов, из которых нужно брать значения
    for(var i = 0; i<inputNames.length; i++)
    {
    //Берём элемент, с которого нужно получить значение.
    var element = document.getElementById(inputNames);
    //Если не нашли элемент - ищем следующий
    if(element == null)
    continue;
    //Получаем значение элемента
    var value = element.getAttribute('value');
    //Заменяем возможную запятую на точку (значение - это число, которое потом нужно будет конвертировать на сервере).
    value = value.replace(",", ".");
    //Если значение не пустая строка - добавляем его данные в строку для запроса
    if(value != '')
    {
    _tags += tagNames + ",";
    _values += value + ",";
    _datesFrom += datesFrom + ",";
    _datesTo += datesTo + ",";
    //alert('Request not blocked now.');
    }
    else
    {
    //Иначе - ничего не делаем. Поля ввода пользователь может оставлять пустыми.
    }
    //Если накопили по 10 значений - скидываем их на сервер.
    if((i % 10 == 0) && (i != 0))
    {
    //Раскомментируйте эти строки, чтобы посмотреть - какие данные в данный момент уходят на сервер.
    //alert(_tags);
    //alert(_values);
    //alert(_datesFrom);
    //alert(_datesTo);
    makeRequest('/WebSite/RegimeSheet/InsertHistoricalValue.ashx', '?tags='+_tags+'&values='+_values+'&datesFrom='+_datesFrom+'&datesTo='+_datesTo);
    while(isRequestBlocked)
    {
    //Вот тут основная проблема.
    }
    //Обнуляем значения буферов
    _tags = "";
    _values = "";
    _datesFrom = "";
    _datesTo = "";
    }
    }
    //Напоследок сбрасываем на сервер остатки буферов.
    makeRequest('/WebSite/RegimeSheet/InsertHistoricalValue.ashx', '?tags='+_tags+'&values='+_values+'&datesFrom='+_datesFrom+'&datesTo='+_datesTo);
    }

    Цикл сделан для того, чтобы "разрезать" весь объем данных, отправляемых на сервер, на части (иначе они в длину запроса не уместятся) и отправлять данные по частям.
    Основная проблема - не знаю, как организовать ожидание в цикле, чтобы на предыдущий запрос успел придти ответ, и только после этого началась цикл возобновил свою работу.
    Когда делаю ожидание через:

    while(isRequestBlocked)
    {
    //Вот тут основная проблема.
    }

    Браузер выдаёт предупреждение:
    Сценарий на этой веб-странице замедляет работу Internet Explorer. Если не остановить сценарий, то компьютер может перестать реагировать на запросы пользователя.
    Можно ли как-то организовать асинхронное ожидание в JavaScript?
    Асинхронное ожидание - это чтобы браузер обрабатывал сообщения от пользователя, но цикл не начал следующую итерацию.
     
  2. Lucid_Mind

    Lucid_Mind Постоялец

    Регистр.:
    18 янв 2009
    Сообщения:
    72
    Симпатии:
    34
    Решил проблему. Сделал итератор внешней переменной, а функция через setTimeout вызывает сама себя, вот код:
    function Action()
    {
    document.getElementById('saveButton').style.visibility = 'hidden';
    var _tags = "";
    var _values = "";
    var _datesFrom = "";
    var _datesTo = "";
    for(m_i = m_i; m_i<inputNames.length; m_i++)
    {
    var element = document.getElementById(inputNames[m_i]);
    if(element == null)
    continue;
    var value = element.getAttribute('value');
    value = value.replace(",", ".");
    //
    if(value != '')
    {
    _tags += tagNames[m_i] + ",";
    _values += value + ",";
    _datesFrom += datesFrom[m_i] + ",";
    _datesTo += datesTo[m_i] + ",";
    }
    else
    {

    }
    //Если накопили по 10 значений и количество накопленных значений не равно 0 - скидываем их на сервер.
    if((m_i % 10 == 0) && (m_i != 0) && (_tags != ''))
    {
    //Раскомментируйте эти строки, чтобы посмотреть - какие данные в данный момент уходят на сервер.
    //alert(_tags);
    //alert(_values);
    //alert(_datesFrom);
    //alert(_datesTo);
    makeRequest('/WebSite/RegimeSheet/InsertHistoricalValue.ashx', '?tags='+_tags+'&values='+_values+'&datesFrom='+_datesFrom+'&datesTo='+_datesTo);
    setTimeout("Action()", 1000);
    m_i++;
    //Если это - последний цикл итерации, выходим из программы и сообщаем об этом пользователю.
    if(m_i == inputNames.length-1)
    alert('Все данные отправлены.');
    return;
    }
    }
    //
    makeRequest('/WebSite/RegimeSheet/InsertHistoricalValue.ashx', '?tags='+_tags+'&values='+_values+'&datesFrom='+_datesFrom+'&datesTo='+_datesTo);
    alert('Все данные отправлены.');
    }
     
Статус темы:
Закрыта.