2016-01-29 27 views
0

我試圖在每個循環之間創建一個延遲。但是,我總是在循環被觸發前結束。辦法,我這樣做是以下幾點:setTimeout裏面forloop? JS NODEJS

for (var i = 0; i < items.length; i++) 
    { 
     setTimeout(function() 
     { 
     console.log(i + ". " + items[i]['name']); 
     priceManagement.FindPrices(items[i]['name']); 
     }, 3000); 
    } 

回答

1

你可以這樣做:

for (var i = 0; i < items.length; i++) 
    { 
     setTimeout(function(i) 
     { 
     console.log(i + ". " + items[i]['name']); 
     priceManagement.FindPrices(items[i]['name']); 
     }, 3000*i, i); 
    } 

,或者可以通過items[i]['name']作爲參數,以及:

for (var i = 0; i < items.length; i++) 
    { 
     setTimeout(function(i, name) 
     { 
     console.log(i + ". " + name); 
     priceManagement.FindPrices(name); 
     }, 3000*i, i, items[i]['name']); 
    } 

,我建議你閱讀此:http://javascriptissexy.com/understand-javascript-closures-with-ease/

+0

它有點工作,但它是在最後一個整數循環,它不能達到'項目'變量的內容。 –

+0

這正是我所需要的。謝謝! –

2

您的主循環正在執行setTimeout持續運作。由於此函數的性質,您將期望看到該函數在它們之間無延遲地執行。

如果你想要近似的效果,當功能的執行時間是小於延遲時間時,你可以使用setInterval。這將與亞當的實踐一致。

但是對於確切的「在每個循環之間創建一個延遲」,您將需要一些回調。

先來考慮:

function main() { 
    doWork(items, 0, items.length); 
} 

function doWork(items, i, loopLength) { 
    // The bit in the loop 
    console.log(i + ". " + items[i]['name']); 
    priceManagement.FindPrices(items[i]['name']); 
    i++; 

    if (i < loopLength) { 
    delayDoWork(items, i, loopLength); 
    } 
    else { 
    // Do rest in the main 
    ... 
    } 
} 

function delayDoWork(items, i, loopLength) { 
    setTimeout(function(items, i, loopLength) 
    { 
    doWork(items, i, loopLength); 
    }, 3000, items, i, loopLength); 
} 

這將保證環路之間的確切延遲。

編輯

你可能要爲此做更多的實驗,因爲我不是一個專家知道如何setInterval設計在JS的工作,因爲它不是多線程的性質是什麼?起點將考慮下面的報價SO

實際上,setTimeout()會在執行隊列的末尾重新排隊新的JavaScript。

+0

對,這是另一種方式,我意識到這一點。然而,它需要更多的代碼,而且我很好奇爲什麼這不像我預期的那樣工作,就像在不同的編程語言中一樣,我從來沒有遇到類似的問題。謝謝你的解釋! –

+1

我也不是一個完整的JS傢伙。乾杯:) – zcui93