Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Web Worker и Ajax. Параллельное выполнение (https://javascript.ru/forum/misc/59360-web-worker-i-ajax-parallelnoe-vypolnenie.html)

Naararouter 07.11.2015 20:35

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);

Но, к сожалению, требуемый результат получить так и не удалось. Есть ли какие-либо идеи?

loljs 07.11.2015 21:21

Цитата:

Сообщение от Naararouter
Но когда нажимаю кнопку быстро 2 раза, то результат второго нажатия приходит только после первого

Не совсем понятно, почему должно быть иначе? Это зависит, вообще то от сети, и от обработки сервером, но в вашем случае при любой реализации этот результат вполне логичен.

Naararouter 07.11.2015 23:07

Вопрос больше звучит не "почему?", а "как сделать так, что бы получить ожидаемый мною результат?":help:

loljs 08.11.2015 00:14

К сожалению, не могу Вам помочь, так как я толком не понял вообще, чего Вы хотите. У Вас в обоих листингах практически одинаковый результат, там только время отличается.

loljs 08.11.2015 00:22

Naararouter,
В соответствии с вашим "желанием", насколько я понял, Вы хотите, чтобы 3 запрос сервер отдавал с бОльшей задержкой чем первые 2. Так кто Вам мешает установить эту задержку на сервере?

Naararouter 08.11.2015 12:24

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


Часовой пояс GMT +3, время: 14:32.