2016-05-29 73 views
-1

比方說,這個功能正在運行:如何在JavaScript中打破外部循環?

var runningFunction = "none", 
    foo    = 1000, 
    counter   = 0; 

function someFunc() { 

    runningFunction = "someFunc"; 

    from(var i = 0; i < foo; i++) { 

     counter++; 

    } 

} 

,我想打破,說在一個window.resize檢測

$(window).resize(function() { 

    // break someFunc function 
    // say scenario broke at count = 595 

} 

我怎麼能這樣做?我可以寫一些函數正在運行的變量,如上所示。

+1

JavaScript有**運行到完成**語義。這意味着'someFunc'會阻止一切,直到返回。如果您想要實現非阻塞行爲,請仔細查看異步編程,**事件循環**和**搶先式多任務**。 – rand

+0

@Iven感謝這一點,我會閱讀了關於這一點,我需要做這項工作,否則我的工作會有儘管是一個語言問題的已知漏洞。 – joehungjohn

+0

爲什麼不直接在for循環中添加一個條件break?:if(ready){break; } –

回答

3

你不能。函數中的所有代碼都將在塊中運行。其他代碼如resize事件偵聽器將等待函數完成。

如果你真要「暫停」,你需要將它分解成不同的功能,並使用setTimeout撥打下一個。這將允許其他代碼在中間運行。

var timer, 
 
    counter = 0, 
 
    result = document.getElementById('result'); 
 
function someFunc() { 
 
    counter++; 
 
    result.textContent = counter; 
 
    if(counter < 1e5) timer = setTimeout(someFunc, 0); 
 
} 
 
someFunc(); 
 
document.getElementById('stop').addEventListener('click', function() { 
 
    clearTimeout(timer); 
 
});
Counter: <span id="result"></span><button id="stop">Stop counter</button>

+0

的問題是,我試圖阻止動畫以調整大小/重新定位的元素,然後重置動畫...因爲現在,這些元素不調整因爲你們說,該動畫來完成,而這些動畫已經被分解成細分市場。但是每個細分市場本身都無法停止。那麼我會得到這些巨大/不合適的元素。 – joehungjohn

+0

哇,這太好了,這可能是解決這個問題的唯一方法,如果是的話,非常感謝。我會試着理解你的代碼,然後在我的代碼中實現它。再次感謝。直到現在我還沒有聽說過ClearTimout。 – joehungjohn

+0

'clearTimeout'從隊列中移除一個'setTimeout'定時器。 – Oriol