2015-10-12 57 views
1

有一天,我在JavaScript中將此函數作爲jQuery插件中對象的簡單DTO編寫。我假設如果我在該函數的末尾寫了一條通用的return gridColumns行,則可能會在我的for循環完成填充之前返回該陣列。所以我最後寫了這個while (true)聲明,認爲我很聰明。如何理解JavaScript的同步性/異步性

function getGridColumns() { 
     var gridColumns = []; 
     var records = $("#jqxGrid").jqxGrid("columns").records; 
     for (var i = 0; i < (records.length); i++) { 
      var obj = { 
       datafield: records[i].datafield, 
       width: records[i].width, 
       cellsalign: records[i].cellsalign, 
       hidden: records[i].hidden 
      } 
      gridColumns.push(obj); 
     } 
     while (true) { 
      if (gridColumns.length == records.length { 
       return gridColumns; 
      } 
     } 
    }; 

我的一個朋友看了我的小「黑客」,並說,這是完全沒有必要的,我做了一些測試,並確定他是對的。

所以,這就是我所在的地方。 如何是JavaScript異步的,它怎麼樣?任何人都可以幫助我理解這種範式,以便我可以編寫更好的JavaScript?

+3

當您對異步服務進行函數調用時,它是異步的。上面的代碼中沒有任何符合該描述。 – Pointy

+0

@Pointy,所以async必須被明確定義,否則JavaScript將同步執行? –

+0

感謝downvote,誰做到了。對於想要學習的人來說,真的很有建設性,就像我一樣。 –

回答

2

是產生新的「線程」的執行,因此可以這麼說引進一個異步的情況在JavaScript中的AJAX調用回調函數(除非調用專門製作synchrounous)和setInterval()setTimeout()通話最常見的機制。正如Pointy所指出的那樣,這還不止於此。

+2

還有其他一些服務在瀏覽器中引入了異步行爲,還有更多類似Node.js的環境。 – Pointy

+0

謝謝Pointy,有一種感覺,我並不是很瞭解這一點。更新我的答案,說「最常見」而不是「全部」。 –

+0

當然這些是最常見的,或者至少是新的JavaScript程序員遇到的第一件事情:)關於異步行爲的另一個重要問題是像Google Maps這樣的API,它會隱藏AJAX操作。 – Pointy