2014-02-07 104 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

这是正确的 –

相关问题