【问题标题】:requesting two Ajax请求两个 Ajax
【发布时间】:2012-01-19 21:30:23
【问题描述】:

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

所以我想我会这样做:

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

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

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

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

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

它有效..但只有当我在 ajax() 顶部添加一个警报以让我知道我已经到达。

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

我错过了什么?

一切顺利 J

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

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);
        }
    }
}

【问题讨论】:

    标签: ajax reference instances


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 谢谢,我今天看看。一夜之间,我想我可以使调用递归,给它一个参数数组,在每次调用时,它会删除顶部数组元素,直到数组为空。你的看起来更容易:-)
    • 如果它没有准备好,那不是不会执行第二个调用吗?它不是“等待”它准备好......是吗?
    • 我有这个机会吗?
    • 好的,我刚刚用我想到的递归的东西更新了我上面的问题..感觉它会起作用吗?我会让你们知道的。
    • 我很好奇 - 你不使用 jQuery AJAX 库有什么原因吗? jQuery AJAX 库支持回调,它允许您在第一个函数完成时执行第二个函数。
    猜你喜欢
    • 2013-01-21
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-19
    • 1970-01-01
    • 2011-11-28
    相关资源
    最近更新 更多