2015-09-08 4 views
4

Я пытаюсь понять цикл событий js. Это мой JS код:Понимание цикла событий JS

var start = new Date().getTime(); 
var url = "/WebForm1.aspx/Test1"; 
$.ajax({ 
    type: "POST", 
    url: url, 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: function (data) { 
     console.log('Test1, elapsed: ' + (new Date().getTime() - start) + 'ms'); 
    }, 
}); 

url = "/WebForm1.aspx/Test2"; 
$.ajax({ 
    type: "POST", 
    url: url, 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: function (data) { 
     console.log('Test2, elapsed: ' + (new Date().getTime() - start) + 'ms'); 
    }, 
}); 

url = "/WebForm1.aspx/Test3"; 
$.ajax({ 
    type: "POST", 
    url: url, 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: function (data) { 
     console.log('Test3, elapsed: ' + (new Date().getTime() - start) + 'ms'); 
    }, 
}); 

Это мой сервер код сторона:

[WebMethod] 
public static void Test1() 
{ 
    System.Threading.Thread.Sleep(1500); 
} 

[WebMethod] 
public static void Test2() 
{ 
    System.Threading.Thread.Sleep(2000); 
} 

[WebMethod] 
public static void Test3() 
{ 
    System.Threading.Thread.Sleep(3000); 
} 

Теперь результат:

Test1, elapsed: 1542ms 
Test3, elapsed: 4578ms 
Test2, elapsed: 6636ms 

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

+0

выглядит как серверная сторона однопоточная для меня –

+1

что вы имеете в виду «похоже» :) это однопоточное или нет – omriman12

+0

Ajax-вызовы должны быстро срабатывать последовательно, но если сервер блокирует и обрабатывает их каждый из них должен ждать своей очереди. Это серверная сторона. –

ответ

2

Этот эксперимент показывает, что сервер обрабатывает запросы поочередно, а не параллельно. Почему это не сразу видно.

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

+0

, как я вижу из @Stryner, ссылку, потому что это использует тот же идентификатор сеанса – omriman12

+0

Возможно, я ничего не вижу в вашем коде, который указывает, что сеансы используются. Есть ли какой-нибудь код оболочки? – Halcyon

0

Два аргумента: правильный. Ваш сервер может обрабатывать только один запрос за раз (с тем же самым происхождением), а javascript должен ждать сервера. Javascript anyways будет выполнять один ответ вовремя, потому что он однопоточный.

+0

_Ваш сервер может обрабатывать только один запрос за время_ - ** доказательство? ** _Javascript anyways будет выполнять один запрос в момент времени_ - ** нет ** (если не передано asynch = false, что это не так) – Halcyon

+0

Так как asp .net работает http://stackoverflow.com/questions/1735107/can-a-single-asp-net-user-make-more-than-one-request-at-a-time-if-the-session-is , и вы правы с javascript, он может выполнять n запросов, но ответы будут обрабатываться один за другим. Это больше о стороне сервера. –

+0

Это не имеет никакого отношения к asp.net, но с тем, как работают сессии; или заблокированный ресурс в целом. Вы видите такое же поведение в PHP. Если вы закрываете сеанс до того, как вы 'sleep()', остальные запросы не должны ждать. – Halcyon

Смежные вопросы