2014-04-01 22 views
0

我有一個屬性數組,這些屬性是需要通過對數據庫的AJAX調用來持久保存的對象的子對象。然而,現在API的工作方式(這是不太可能改變的),我無法批量發送字符串,如果我使用簡單的循環發送它們,它們將互相覆蓋。所以我需要處理添加和減法作爲FIFO隊列。在JavaScript中處理隊列時可能出現的競爭狀況?

我只是想驗證,如果我的想法是正確的,在處理AJAX回調中斷處理的行爲,添加/減去屬性的隊列。

代碼(使用jQuery $就速記):

var queue = [], 
    processing = false; 

function processQueue() { 
    if(queue.length <= 0) { 
     processing = false; 
     return; 
    } 

    if(processing) { 
     return; 
    } 

    processing = true; 
    var cmd = queue.unshift(); 

    $.post(cmd.location, cmd.payload, function handleSuccess() { 
     processing = false; 
     processQueue(); 
    }); 
} 

function addToQueue(url, payload) { 
    queue.push({ location: url, payload: payload }); 
    processQueue(); 
} 

主要是我很擔心這processQueue();呼叫被最初的一個後首次提出。假設我已經將幾件東西添加到隊列中,然後調用processQueue();。我相信,如果在致電addToQueue()的呼叫中間撥打handleSuccess();,那麼從addToQueue()撥打processQueue()將導致自processing == true以來的提前回報。但是,我不確定這一點。

我的思想正確嗎?

回答

2

處理AJAX回調中斷處理向隊列添加/減去屬性的操作。

否。JavaScript是單線程的,在同步代碼中不會出現競態條件。 ajax回調在事件隊列中排隊,並將在任何當前正在執行的代碼之後執行。