为什么ajax值返回未使用settimeout定义?我如何解决它?

时间:2015-10-12 15:23:16

标签: javascript ajax

我有两个AJAX函数,我需要在HTML body onload时调用它们。该功能需要以不同的时间间隔操作以进行不同类型的聊天,这样我就可以减轻服务器上的工作负担。 (请不要JQuery)

function funcNamePOST(data1, data2) {
    if(window.XMLHttpRequest){
        xmlhttp = new XMLHttpRequest();
    }else {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }

    xmlhttp.onreadystatechange = function(){
        //Appending xml data to html in a for loop
    }
    var date = new Date();
    var datetime = date.getTime();
    xmlhttp.open("POST", "page1.php", true);

    xmlhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
    var parameters = "data1="+data1+"&data2="+data2;
    xmlhttp.send(parameters);
}

function funcNameGET(data1, data2) {
    if(window.XMLHttpRequest){
        xmlhttp = new XMLHttpRequest();
    }else {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }

    xmlhttp.onreadystatechange = function(){
        //Appending xml data to html in a for loop
    }
    var date = new Date();
    var datetime = date.getTime();

    xmlhttp.open("GET", "page2.php?datetime="+datetime, true);

    xmlhttp.send();
}

这两个AJAX都可以正常工作,但这很奇怪然后我尝试嵌套它们和/或将它们添加到时间函数中。 例如:

function nest(data1, data2) {
    funcNamePOST(data1, data2); 
    funcNameGET(data1, data2);
}

OR

function nest(data1, data2) {
        setTimeout( function(){
            funcNamePOST(data1, data2); 
        }, 10000);
        //I need this to run every 10 sec
        setTimeout( function(){
            funcNameGET(data1, data2);
        }, 60000);
        //I need this to run every 60 sec
    }

只有嵌套中的第二个AJAX执行。函数在嵌套中的顺序并不重要,然后在第一个函数上输出错误。

TypeError:AJAX" XML值"返回未定义。

我知道这不是真的,因为他们自己的工作很好。

我让它工作的唯一方法是将它们放在定时功能中,但是我不能以这种方式每10秒运行第一个功能。

function nest(data1, data2) {
        setTimeout( function(){
            funcNamePOST(data1, data2); 
            setTimeout( function(){
                funcNameGET(data1, data2);
            }, 60000);
        }, 10000);
    }

1 个答案:

答案 0 :(得分:2)

您的函数正在共享一个名为xmlhttp的全局变量。使用var

在每个函数中单独声明该变量
var xmlhttp;

现在发生的事情是,当通过覆盖xmlhttp的值调用它时,每个函数都“踩踏”另一个函数。通过改为使用两个局部变量,这是不可能发生的。

捕捉这样的问题(至少在较新的浏览器中)的一个好方法是养成添加

的习惯
"use strict";

作为每个函数中的第一行代码,或者如果可能的话作为整个脚本块中的第一行代码。如果您这样做,则将解释器置于“严格”模式,并且在该模式下,它会将xmlhttp的分配标记为错误。