Javascript ajax调用期间的全局变量未正确更新
所以Javascript不是多线程的。但我有以下问题。 我使用从Javascript ajax调用期间的全局变量未正确更新,javascript,jquery,ajax,browser,Javascript,Jquery,Ajax,Browser,所以Javascript不是多线程的。但我有以下问题。 我使用从setTimeout调用的函数的AJAX调用。在重新调度函数之前,我需要知道是否能够区分何时存在活动的AJAX调用。 为此,我使用了两个全局变量。因此,代码结构如下所示: setTimeout(some_function, 10000); window.ajax_running = 0; window.calls_so_far = 0; function some_function () { if(win
setTimeout
调用的函数的AJAX调用。在重新调度函数之前,我需要知道是否能够区分何时存在活动的AJAX调用。为此,我使用了两个全局变量。因此,代码结构如下所示:
setTimeout(some_function, 10000);
window.ajax_running = 0;
window.calls_so_far = 0;
function some_function () {
if(window.ajax_running) {
setTimeout(some_function, 10000);
return;
}
window.ajax_running = 1;
$.ajax({
//various
success: function (data) {
window.calls_so_far = window.calls_so_far + 1;
console.log('Running calls: ' + window.calls_so_far);
if(window.calls_so_far >= SOME_VALUE) {
//we are ok ajax has finished
window.ajax_running = 0;
}
}
简单的代码。问题是它不起作用。我在控制台中看到:
正在运行的呼叫:1因此,全局变量不会递增。每个AJAX调用都会看到原始值0并将其递增(就像有线程一样)。
我搞砸了什么?如何修复此问题?当成功运行时,ajax调用已经完成,因此您在添加调用时没有运行此调用。 我不确定您为什么需要“计数”调用,但如果这只是另一个问题(在第一个函数完成后调用相同的函数,我建议使用以下方法:
var counter;
counter = 0;
function recallSomeFunction() {
setTimeout(some_function, 10000);
}
function some_function () {
$.ajax({
//various
success: function (data) {
if (++counter < SOME_VAL) recallSomeFunction();
//...
},
error: function ( jqXHR, textStatus, errorThrown )) {
recallSomeFunction()
//...
});
}
var计数器;
计数器=0;
函数recallSomeFunction(){
setTimeout(一些函数,10000);
}
函数some_函数(){
$.ajax({
//各种各样的
成功:函数(数据){
如果(++计数器
您是否在某处初始化了window.calls\u sou\u far?类似window.calls\u sou\u far=0@StefanoOrtisi:是的,它们被设置为0window.ajax\u running=0;一旦ajax完成,我会运行许多ajax调用,您应该使用)
关闭console.log函数。您可以用window.calls\s替换增量行o_far+=1;
我正在增加计数器,以查看有多少ajax调用已完成。当它们全部完成(如果条件满足)时,我将ajax标记为未运行。请参阅更新的OPSo,我添加了一个计数器变量。这应该会起作用。处理无信号量的异步调用的方法总是更安全的(更安全??不是一个会说英语的人);-)但我也使用计数器。从窗口更改为var
也不起作用。同样的问题