2014-12-16 2 views
0

Я понимаю, что JavaScript однопоточный (как объясняется в этом вопросе: If Javascript is not multithreaded, is there any reason to implement asynchronous Ajax Queuing?), однако я пытаюсь понять, как это относится к приложению, которое я разработал. См. Код ниже:AJAX, действующий многопоточным способом

function GetSQLTable() { 
     var str = $("#<%=fieldDatabaseReferences.ClientID%>")[0].value 
     var res = str.split(","); 
     $("#LoadingImage").show(); 
     $("#LoadingImage2").show(); 

     for (var i = 0; i < res.length; i++) { 
      (function (i, res) { 
       setTimeout(function() { 
        GetSQLTable2(i, res.length, res) 
       }, 0); 
      })(i, res); 
     } 
    } 

function GetSQLTable2(i,reslength,res) { 
      //if (i == 0) 
      //{ 
      // var start = new Date().getTime(); 
      //} 
     var div = document.createElement('div'); 
      div.id = "div" + i 
      document.getElementById('info_div').appendChild(div); 

      var PossiblesPage = false; 
      $.ajax({ 
       type: "POST", 
       url: "PrimaryNominalAjax.aspx/GetSQLTable", 
       data: '{username: "' + $("#<%=fieldUserName.ClientID%>")[0].value + '", terminalname: "' + $("#<%=fieldTerminalName.ClientID%>")[0].value + '", terminalip: "' + $("#<%=fieldTerminalIP.ClientID%>")[0].value + '", mappingid: "' + res[i] + '", usergroup: "' + $("#<%=fieldUserGroup.ClientID%>")[0].value + '", usn: "' + $("#<%=fieldUSN.ClientID%>")[0].value + '", requester: "' + $("#<%=fieldRequester.ClientID%>")[0].value + '", reason: "' + $("#<%=fieldReason.ClientID%>")[0].value + '", rrd: "' + $("#<%=fieldRRD.ClientID%>")[0].value + '", review: "' + $("#<%=fieldReview.ClientID%>")[0].value + '", possibles: "' + PossiblesPage + '",linkno: "", urn1: "", urn2: ""}', 
       contentType: "application/json; charset=utf-8", 
       timeout: 80000000, 
       dataType: "json", 
       success: OnSuccess(i, reslength), 
       error: OnError, 
       failure: function (response) { 
        alert('there was an error loading the webpage') 
       } 
      }); 
     } 

fieldDatabaseReferences заполняется на стороне сервера. AJAX подключается к нескольким локальным базам данных (до 30) и размещает информацию на экране по мере готовности.

Звонки на различные серверы баз данных асинхронны. Неужели это многопоточный эффект?

+0

Что ваш вопрос? –

+2

Нет. Многопоточность отличается от асинхронной. Конечно, запросы происходят в теории * одновременно *, но Javascript работает в одном потоковом потоке событий, поэтому все «OnSuccess» выполняются за один раз. В отличие от многопоточности, где каждый атомный оператор внутри 'OnSuccess' может быть выполнен произвольным образом – CodingIntrigue

+0

BTW: эта строка' success: OnSuccess (i, reslength), '(вероятно) не делает то, что вы думаете. – Jamiec

ответ

1

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

Когда вы предполагаете, что цикл завершится? Одна секунда? Нет, он будет работать бесконечно (если проверка Date.now там не была). Тот факт, что значение, зарегистрированное на консоли, равно true, подтверждает, что таймаут не уволен. Он находится в очереди, ожидая завершения блока var run = true...console.log().


Что касается вашего примера, порядок выполнения будет:

/* note: no two functions execute at same time */ 
GetSQLTable(); 
/* functions scheduled via setTimeout execute one by one */ 
GetSQLTable2(0, ...); 
GetSQLTable2(1, ...); 
GetSQLTable2(2, ...); 
/* AJAX requests complete one by one, not necessarily in the order they started */ 
OnSuccess(2); 
OnSuccess(0); 
/* JavaScript thread could be idle during callbacks */ 
OnSuccess(1); 

Ссылки:

+0

Спасибо, это полезно. +1. – w0051977

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