2011-11-30 69 views
2

我知道,使用JavaScript和'atomic'這兩個詞 - 同一句子中的任何內容都有點奇怪,因爲JavaScript被認爲是異步的,因此它不是非常原子的。由異步ajax回調導致的「原子」操作

//編輯 這是我的錯誤!通過讓警報消失(並在鉻中隱藏更多警報),它會迅速中斷並讓其他代碼飛行。 JavaScript是單線程的。

快速 - >實際問題; 在哪種情況下我們可以通過異步回調中斷進行保存,我們如何防止它們在某些代碼塊中出現?

長 - >我的情景; 我的整個應用程序是非常遞歸的,並觸發許多Ajax請求,在返回時觸發更多的遞歸函數,可能會觸發更多的Ajax請求。 在我的代碼中,我對數組有一些非常重要的操作,它們必須在下一個操作發生之前完成(儘管簡單的推/拼接邏輯)。

我有一個問題,我得到了一個數組中的一個鍵的索引並將其保存在一個變量中。然後我將它與-1進行比較,如果它是真的,我拼接(不僅是未設置)數組中的元素。 現在,在獲取索引和拼接之間,異步回調與結果一起返回並開始遞歸,然後通過添加/刪除更多項目(並搞亂之前獲得的索引值)來更改數組。

這是舊代碼;

if (this.dataset && (index=this.dataset.children.indexOf(child.key))!==-1){ 
    console.log("removed from dataset!"); 
    //<=== AJAX Call Returns and adds/removes items from the array 
    this.dataset.children.splice(index, 1); //goes bad, because index not good anymore 
    ... 
} 

,這是「工作」,而不是優化的代碼

if (this.dataset && (index=this.dataset.children.indexOf(child.key))!==-1){ 
    console.log("removed from dataset!"); 
    //<=== AJAX Call Returns and adds/removes items from the array 
    //Problem solved, since I'm getting the index again 
    this.dataset.children.splice(this.dataset.children.indexOf(child.key), 1); 
    ... 
} 

我只是簡單地再次搜索索引,直接拼接它拿走。

我的一般問題是,在哪種情況下我們可以通過異步回調中斷進行保存,並且我們如何防止它們在某些代碼塊中出現?

我的具體問題,各位StackOverflowers,如果是在理論上,Ajax回調可在之間稱爲的功能的indexOf返回指數和拼接功能切割陣列了。

謝謝您的幫助

P.S我知道,我只是能取消設置陣列領域,我的問題,指數將得到解決。但那不是我想要的,因爲我在序列化這些信息,並且不需要100個空的條目。尋找一種通用的方法是我的目標:)

回答

7

JavaScript本質上是單線程的。這意味着如果AJAX響應到達或者應該觸發超時/間隔但其他代碼正在運行,則響應回調/超時將會等待等待

這是爲什麼選擇JavaScript作爲node.js的主要原因之一。

參見:

+0

謝謝!我意識到自己剛剛得到了很好的迴應,當時我意識到自己的警報在兩者之間被解僱,導致回調不能觸發。 – japrescott

2

JavaScript是完全單線程的。

異步回調只能在沒有其他代碼正在使用消息隊列(如Windows消息)運行時運行。
所有代碼運行在UI線程和你的代碼不能再在中間中斷(除非處於無響應腳本警告)

需要注意的是JavaScript並支持真正的多線程使用HTML5的Web工作者。

+0

還有一個原因是關於JavaScript線程安全的,沒有人會談。 – SLaks