2014-02-07 150 views
0

更新: 我有一個完全不同的問題,我會一起刪除問題,但因爲有答案,我不被允許。 /OP如果我想要一個異步線程,我需要setTimeout嗎?

我有一個腳本,這是非常複雜的,很難提煉,但這裏是我在做什麼本質:

var modulesCount = 4; 

// setup the modules object 
for (var i = 1; i <= modulesCount; i++) {  
    composeModule(i); 
} 

我有一些奇怪的行爲,這裏是好像每次調用函數composeModule()沒有被創建,所以我想,我將不得不使用一個setTimeout爲了將線程分成像這樣的4個不同的線程?這樣說:

// setup the modules object 
for (var i = 1; i <= modulesCount; i++) {  
    setTimeout(function() { 
     composeModule(i); 
    }, 1); 
} 

------------------- UPDATE

試過這種

var c = 1; 
    for (var i=1;i<=modulesCount;i++) {  
     console.error('actual count is: '+c+' while variable i is: '+i); 
     self.composeModule(i,initialCall); 
     c++; 
    } 

,以檢查是否存在問題與我的變量,但它對每個控制檯輸出中的c是同樣的。還是我誤解了你們的觀點?

+1

JavaScript並不是真正的多線程語言 –

+2

爲什麼你認爲所有的函數調用都沒有做,爲什麼會在'setTimeout'調用中修復它?我根本沒有跟進。 –

+0

您可以使用'console.log'或** https://github.com/flatiron/winston**在代碼中記錄一些消息嗎?我很難相信循環不會調用'composeModule'四次。也許你的問題在別的地方。 – Jess

回答

1

如果你真的想寫一個循環,你需要把變量i成封閉:

// setup the modules object 
for (var i = 1; i <= modulesCount; i++) {  
    (function (inner_i) {setTimeout(function() { 
     composeModule(inner_i); 
    }})(i), 1); 
} 

JavaScript closure inside loops – simple practical example

+0

你得到一個+1來確定OP實際需要什麼,而不是他要求的。我投票重複:) –

+1

這是一個很好的答案,但我認爲OP只添加setTimeout來嘗試調試問題。 *聳肩* – Jess

+1

這是正確的 –

相關問題