2017-02-04 45 views
0

我是新來的節點JS和我只是習慣了這種語言的異步性...如果您正在同時修改正在節點js中循環的數組,會發生什麼情況?

我有數組中的更新值的函數一個每60秒(從數據庫中抓取這些)。

我也有用於處理來自用戶的請求的功能,並且在處理這些請求,它使用從值(所以我遍歷)。

我想知道如果這種類型的事異步會崩潰我的應用程序?

例如,如果我在遍歷一個,並搶得價值,但在同一時間的中間是,60秒計時器命中並開始更新一個的值,可以什麼壞事發生?

如果是這樣,你有任何設計建議,以避免這種情況?

非常感謝您的幫助!

+2

異步並不意味着多線程 - 所以,當你同步循環** A **,任何會導致**的變化的「事件」將不會運行,直到你的同步代碼完成 –

+0

你會得到如果您從代碼中包含特定的代碼示例,那麼更具體和更有意義的答案。併發性問題取決於確切的代碼,不能僅從您的文本描述中確定。 – jfriend00

回答

0

它確實取決於您的確切代碼,因此如果沒有看到並理解您的確切代碼,就不能提供具體的答案。

的Javascript中的node.js是單線程的,所以如果您是通過陣列作爲.forEach()這樣的同步機制或for循環,那麼任何異步調用,你做將啓動循環,但他們無法完成,直到當前的後執行線程(包括通過數組的循環)完全完成。所以,當你還在循環時,沒有異步結果會影響數組。

有更少的傳統和異步方式來遍歷數組。如果您使用其中的一種,我們必須查看您的實際代碼,以提供有關是否存在任何併發問題的意見。

例如,如果我在循環過,並搶得價值 ,但在同一時間的中間是,60秒計時器命中,並且開始更新 A中的值,可以什麼壞事發生?

node.js是事件驅動的。這意味着當一個計時器準備好觸發時,它會將一個事件插入到node.js事件隊列中。直到當前正在運行的Javascript完成,並且node.js JS引擎可以將下一個事件從事件隊列中拉出後,纔會處理該事件。所以,定時器不會中斷你當前運行的Javascript,永遠。

0

您可能會遇到這樣做的奇怪錯誤。如果你處於A的中間而A變得更短,它將終止循環。例如,假設A有30個元素。雖然你正在循環,但當你在索引16上時,它會變爲15。它不會繼續循環。另一個例子。假設A的長度爲2.當你完成第一個索引的內容時,當你進入第二個索引時,兩個索引的值都被改變,那麼第一個索引將被報告爲舊值,第二個索引將被作爲新的價值。

相關問題