Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 07.11.2015, 20:35
Новичок на форуме
Отправить личное сообщение для Naararouter Посмотреть профиль Найти все сообщения от Naararouter
 
Регистрация: 07.11.2015
Сообщений: 3

Web Worker и Ajax. Параллельное выполнение
Здравствуйте. Имеется: одна кнопка. При нажатии посылает ajax на сервер (C#), который делает следующее:
Код:
int test = (int)Session["test"]; //Читаю из сессии переменную
test++; //прибавляю к ней значение 1
Session["test"] = test; //возвращаю в сессию
Thread.Sleep(5000); //сплю ( предполагаемая долгая операция )
return Json(test,JsonRequestBehavior.AllowGet); //возвращаю результат, флаг аллоугет - для отладки.
Но когда нажимаю кнопку быстро 2 раза, то результат второго нажатия приходит только после первого. Т.е. следующим образом:
Цитата:
2015-11-08 00:23:46.098 (index):1183 Клик!
2015-11-08 00:23:51.139 (index):1187 1
2015-11-08 00:23:51.960 (index):1183 Клик!
2015-11-08 00:23:52.141 (index):1183 Клик!
2015-11-08 00:23:56.993 (index):1187 2
2015-11-08 00:24:01.998 (index):1187 3
Мне же необходим следующий результат ( какой логично бы и хотелось увидеть ):
Цитата:
2015-11-08 00:23:46.098 (index):1183 Клик!
2015-11-08 00:23:51.139 (index):1187 1
2015-11-08 00:23:51.960 (index):1183 Клик!
2015-11-08 00:23:52.141 (index):1183 Клик!
2015-11-08 00:23:56.993 (index):1187 2
2015-11-08 00:24:56.998 (index):1187 3
Но увы...перерыл множество гугл-ссылок начиная от создания так называемых Deferred-объектов, заканчивая Web Worker. Как понимаю, здесь необходимо реализация многопоточности, и вроде бы как последние (веб воркеры)дают эту возможность. Реализовал следующее:
$("#test-button1").click(function () {
            console.log("Клик!");
            var worker = new Worker('worker.js');

            worker.addEventListener('message', function(e) {
                console.log(e.data);
            }, false);

            worker.postMessage("start");
});

Worker.js:
self.addEventListener('message', function(e) {
    var xhr = new XMLHttpRequest();
    xhr.open('GET', 'Home/TestMethod', true);
    xhr.send();
    if (xhr.status != 200) {
        self.postMessage(xhr.status + ': ' + xhr.statusText );
    } else {
        self.postMessage(xhr.responseText);
    }
}, false);

Но, к сожалению, требуемый результат получить так и не удалось. Есть ли какие-либо идеи?
Ответить с цитированием
  #2 (permalink)  
Старый 07.11.2015, 21:21
Аспирант
Посмотреть профиль Найти все сообщения от loljs
 
Регистрация: 06.11.2015
Сообщений: 68

Сообщение от Naararouter
Но когда нажимаю кнопку быстро 2 раза, то результат второго нажатия приходит только после первого
Не совсем понятно, почему должно быть иначе? Это зависит, вообще то от сети, и от обработки сервером, но в вашем случае при любой реализации этот результат вполне логичен.
Ответить с цитированием
  #3 (permalink)  
Старый 07.11.2015, 23:07
Новичок на форуме
Отправить личное сообщение для Naararouter Посмотреть профиль Найти все сообщения от Naararouter
 
Регистрация: 07.11.2015
Сообщений: 3

Вопрос больше звучит не "почему?", а "как сделать так, что бы получить ожидаемый мною результат?"
Ответить с цитированием
  #4 (permalink)  
Старый 08.11.2015, 00:14
Аспирант
Посмотреть профиль Найти все сообщения от loljs
 
Регистрация: 06.11.2015
Сообщений: 68

К сожалению, не могу Вам помочь, так как я толком не понял вообще, чего Вы хотите. У Вас в обоих листингах практически одинаковый результат, там только время отличается.
Ответить с цитированием
  #5 (permalink)  
Старый 08.11.2015, 00:22
Аспирант
Посмотреть профиль Найти все сообщения от loljs
 
Регистрация: 06.11.2015
Сообщений: 68

Naararouter,
В соответствии с вашим "желанием", насколько я понял, Вы хотите, чтобы 3 запрос сервер отдавал с бОльшей задержкой чем первые 2. Так кто Вам мешает установить эту задержку на сервере?
Ответить с цитированием
  #6 (permalink)  
Старый 08.11.2015, 12:24
Новичок на форуме
Отправить личное сообщение для Naararouter Посмотреть профиль Найти все сообщения от Naararouter
 
Регистрация: 07.11.2015
Сообщений: 3

loljs,
К сожалению, не правильно поняли меня . Попробую пояснить более подробно: допустим, что первый запрос отправляется в некоторый нулевой момент времени, обозначим его t0. Затем (исходя из результатов консоли) он возвращает результат (равный единице) в момент времени t0 + 5c. Потом в момент времени t0 + 6с и t0 + 7с я посылаю еще два запроса. Ожидаемое время возвращение результата для меня(спустя 5с после нажатия кнопки, относительно каждого запроса): t0 + 11с и t0 + 12с, соответственно для первого и второго запроса. НО! В действительности они возвращаются в моменты времени t0 + 11c и t0 + 16с, соответственно для первого и второго запроса.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выполнение скриптов в AJAX Mikhail1989 jQuery 3 31.07.2015 04:21
Последовательное выполнение Ajax запросов. jgunchenko AJAX и COMET 1 07.05.2014 12:50
xhr2 and web worker upload single file VerDiz AJAX и COMET 2 20.08.2013 09:59
Книги по Ajax BaVa Учебные материалы 18 18.08.2013 14:05
Web Worker + ajax Slavenin AJAX и COMET 3 01.09.2011 21:57