JavaScript的setTimeout函數是使我重新評估我所知道的JavaScript小。今天早些時候,我遇到了一個像這樣的循環:瞭解線程/同步性通過JS的setTimeout的
for (i = 0; i < length; i++) {
setTimeout(executeOtherCode, 5000)
}
我預計這個代碼做的是執行executeOtherCode功能,「休眠」 5秒鐘,然後繼續下一個迭代。相反,我得到的是同時執行長度時間的executeOtherCode。
所以從我的理解,setTimeout的是一個異步函數調用。它是否正確?然而,如果我要執行一個常規函數,我們將其稱爲hugeFunction(),這需要1分鐘的時間來執行,下一行代碼將不會執行,直到該函數返回一些東西,是正確的?那麼爲什麼這兩個不同呢?只是語言設計的選擇?
我見過的jQuery等功能,在類似asyncrhonous的行爲方式,喜歡的getJSON。這只是一個知道哪些函數被定義爲異步的問題,或者是否存在某種識別它們的模式?如果是這樣,什麼?
通常,異步函數是處理通過網絡檢索數據或某種I/O操作(例如,新的IndexedDB中的某些方法以及HTML5的WebWorkers功能)的函數。除此之外,沒有真正一致的方法來識別它們;你只需要看看你正在使用的庫的文檔。 –
_「相反,我得到的是同時執行其他代碼」_ - 否,你沒有。該代碼在5000ms之後排隊'executeOtherCode()'被調用'length'時間,同時當前塊繼續。每個超時在儘可能接近5000ms後啓動_但不是在其他JS正在執行時,_因此每個超時都是一個接一個地執行,而不是同時執行,而不是多線程。它似乎是同時發生的,因爲它們之間沒有明顯的延遲。 – nnnnnn