【问题标题】:Possible race condition while processing a Queue in JavaScript?在 JavaScript 中处理队列时可能的竞争条件?
【发布时间】:2014-04-01 17:52:44
【问题描述】:

我有一组属性,它们是对象的子对象,需要通过 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();。我相信,如果在调用addToQueue() 的过程中调用handleSuccess();,那么从addToQueue() 调用processQueue() 将导致自processing == true 以来的提前返回。但是,我对此还不够确定。

我的想法正确吗?

【问题讨论】:

    标签: javascript ajax queue


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-01-26
      • 2011-01-08
      • 2020-07-12
      • 2019-07-04
      • 2023-03-17
      • 2014-02-23
      • 2011-04-01
      • 2014-02-23
      • 1970-01-01
      相关资源
      最近更新 更多