请求两个Ajax

时间:2012-01-19 21:30:23

标签: ajax reference instances

我正在尝试进行两次Ajax调用以获取数据来填充网页的不同位,正如您已经知道的那样,只有第二次发生。

所以我以为我会这样做:

callAjax1('a'); callAjax2('b');

function callAjax1(data) {
 ajax(data);
}

function callAjax2(data) {
 ajax(data);
}

function ajax(data) {
 // calls XMLHttpRequestObject etc
}

我的想法是,不是两次调用ajax(),而是现在,我有两个独立运行的独立的ajax实例。

它有效......但是只有我在ajax()的顶部发出警报才能让我知道我已经到了。

所以我认为警报会在第二次调用之前给出第一个请求时间。因此,我没有设法将它们正确地分成不同的实例。这不可能吗?

我错过了什么?

一切顺利 Ĵ

更新: 我在想这个,我有机会吗?

tParams = new Array (2); // we intend to call ajax twice
tParams[0] = new Array('ajaxGetDataController.php', 'PROJECT', 'id');
tParams[1] = new Array('ajaxGetFileController.php', 'FILE', 'projectId');

<select name='projectSelector' onchange=\"saveData(tParams, this.value);\">\n";

// gets called, twice
function saveData(pParams, pData) // pParams are: PageToRun, Table, Field
{
    if (XMLHttpRequestObject)
    {
        tPage = pParams[0][0]+'?table='+pParams[0][1]+'&pField='+pParams[0][2]+'&pData='+pData;
        XMLHttpRequestObject.open('GET', tPage);\n

        XMLHttpRequestObject.onreadystatechange = callAjax(pParams, pData);

        XMLHttpRequestObject.send(null);

    }   
}

function callAjax(pParams, pData)
{
 if (XMLHttpRequestObject.readyState == 4 &&    XMLHttpRequestObject.status == 200)
    {
        var tReceived = XMLHttpRequestObject.responseXML;
        options = tReceived.getElementsByTagName('option'); // fields and their values stored in simplest XML as options
        popForm(options, pParams[0][1]); // goes off to use the DOM to populate the onscreen form
        pParams.shift();    // cuts off pParams[0] and moves all elements up one
        if (pParams.length>0)
        {
            saveData(pParams, pData);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我会为AJAX函数创建一个就绪状态变量:

function ajax(data) {
 readyState = false;
 // calls XMLHttpRequestObject etc
}

然后在执行第二次调用之前检查就绪状态:

function callAjax2(data) {
if(readyState == true) {
 ajax(data);
 readyState = true;
 }
}

确保在执行AJAX调用后将readyState更改回false。这将确保第一个AJAX调用在第二个尝试触发之前已完成执行。