在JavaScript中处理队列时可能出现的竞争条件?

时间:2014-04-01 17:52:45

标签: javascript ajax queue

我有一个属性数组,它们是一个对象的子属,需要通过AJAX调用持久化到数据库。但是,API现在的工作方式(这种情况极不可能改变)我无法批量发送字符串,如果我使用简单的循环发送它们,它们将互相覆盖。所以我需要将加法和减法处理为FIFO队列。

我只是想验证我的想法是否正确,因为处理AJAX回调会中断处理向队列添加/减去属性的操作。

代码(使用jQuery $ .ajax作为速记):

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();。我相信,如果在致电handleSuccess();的过程中拨打addToQueue(),则processQueue()addToQueue()的调用会导致processing == true提前返回{{1}} 1}}。但是,我对此并不确定。

我的想法是否正确?

1 个答案:

答案 0 :(得分:2)

  

处理AJAX回调会中断处理向队列添加/减去属性的操作。

没有。 JavaScript是单线程的,同步代码中不会出现竞争条件。 ajax回调在事件队列中排队,并且将被安排在任何当前正在执行的代码之后执行。