我有一个属性数组,它们是一个对象的子属,需要通过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}}。但是,我对此并不确定。
我的想法是否正确?
答案 0 :(得分:2)
处理AJAX回调会中断处理向队列添加/减去属性的操作。
没有。 JavaScript是单线程的,同步代码中不会出现竞争条件。 ajax回调在事件队列中排队,并且将被安排在任何当前正在执行的代码之后执行。