多个ajax请求状态?

时间:2011-09-14 15:07:32

标签: javascript ajax xmlhttprequest

我正在编写一个需要执行一些并行的ajax请求的脚本。我正在使用ajax数组但我希望在所有请求完成后执行一些代码(使一些标记可见)。这是代码,希望你能帮助我。

function Update_All(){

    var loading = document.getElementById("loading_image");
    var actualizacion_completa = document.getElementById("actualizacion_completa");
    loading.style.display = "";
    actualizacion_completa.style.display = "none";
    var i=1;
    var ajax= new Array(20);//objetoAjax();
    var limit = 1;
    var ready = 1;
    for (i=1;i<=20;i++)
    {
        var index = i-1;
        ajax[index] = objetoAjax();

        var voatencion = document.getElementById("idatencionf"+i);
        var vohoras = document.getElementById("vhorasf"+i);
        var vtarifa = document.getElementById("tarifaclientef"+i);
        var voexonerado = document.getElementById("vexoneradof"+i);
        var voaprobado = document.getElementById("vaprobadof"+i);
        var campo = document.getElementById("f"+i+"c1");

        if(typeof(campo) != 'undefined' && campo != null){
            var valor = 1;
            if(campo.innerHTML=="Si") valor = 2;
                ajax[index].open("GET","update.php?atencion="+voatencion+"&opc="+5+"&valor="+valor+"&exonerado="+voexonerado.value+"&tarifa="+vtarifa.value+"&horas="+vohoras.value);
            ajax[index].send(null);
            limit = i;
            ajax[index].onreadystatechange=function() {
                if (ajax[index].readyState==4 && ajax[index].status == 200) {
                    ready++;

                    if(ready == limit){
                        loading.style.display = "none";
                        actualizacion_completa.style.display = "";
                    }
                }
            }
        }
        else{
            break;
        }       
    }
}

问题已经准备好永远不会等于限制。

PS:关于西班牙变量的名字;

2 个答案:

答案 0 :(得分:0)

您已经知道限制为20,无需每次使用此limit = i;进行扩充。

只需设置

var limit = 20;

在剧本的开头。

由于数组以0开头,实际上可能需要为限制设置一个较小的值(在本例中为19)。

此外,每次完成AJAX请求时都要添加此行:

console.log('ready = ' + ready);

通过这种方式,您实际上可以看到准备好的值正在停止,或者它是否完全没有增加。

答案 1 :(得分:0)

你的onreadystatechange函数中的index值将不是你所期望的。

建议用以下内容替换当前的onreadystatechange:

(function(ajaxItem, ready) {
    ajaxItem.onreadystatechange = function() {
      if (ajaxItem.readyState==4 && ajaxItem.status == 200) {
        ready++;

        if(ready == limit){
            loading.style.display = "none";
            actualizacion_completa.style.display = "";
        }
    }
})(ajax[index], ready);