如何在ajax调用期间运行javascript?

时间:2011-09-27 20:55:15

标签: php javascript ajax linux exec

在开发一个我正在充分利用javascript php和ajax的网络应用程序时。

我想打电话

display_terminal('feedback_viewer','logs/init-raid-log.txt','Init-Raid');

构建我的终端并调用feed_terminal(),它有自己的setTimeout()递归调用

    var url='../edit_initRaid.php';
    status_text('Initializing raid-array. Please wait a moment...');
    var xmldoc=ajaxPHP2(url,2);

一个只执行该操作的php文件

exec("sudo /usr/bin/./init-raid-drives-web.sh");

这就是我失败的地方。直到php文件中的exec()返回到php文件并且php文件返回到javascript之后才执行下一行。并不重要,但我很确定它不是这样的,因为最初bash脚本将执行2分钟的时间段,javascript将成功使用feed_terminal更新html。情况已经不是这样了。

alert("javascript has returned from ajax call");
    if (xmldoc) {
            status_text('Raid-array initialized successfully. System will now restart.You must re-login to FDAS-Web.');

以下是一堆问题代码

最终我的问题是,如何在ajax调用期间运行javascript? 或者也许我的问题应该是,如何让edit_initRaid返回一个xmldoc,而不是等待exec()返回,或者即使没有脚本完成,我怎么能让exec()返回?

function initRaidArray(){
if (document.getElementById('initRaid_doubleCheck')){
    if (document.getElementById('initRaidHideButtonSpot'))
            document.getElementById('initRaidHideButtonSpot').innerHTML = '';

    var spot=document.getElementById('initRaid_doubleCheck');
    spot.innerHTML='';
    spot.innerHTML='This may take a few moments. Please wait.';
}
    display_terminal('feedback_viewer','logs/init-raid-log.txt','Init-Raid');
    var url='../edit_initRaid.php';
    status_text('Initializing raid-array. Please wait a moment...');
    var xmldoc=ajaxPHP2(url,2);
alert("javascript has returned from ajax call");
    if (xmldoc) {
            status_text('Raid-array initialized successfully. System will now restart. You must re-login to FDAS-Web.');
    }
}

其中display_terminal()执行两项操作,构建表并将其附加到页面,并调用feed_terminal(logfile,bigDiv,0)

function feed_terminal(logFile,bigD,lap){
    // AJAX
    bigD.innerHTML = '';
    var url='../view_xml_text.php';
    /*
     * lap(0)=clear file , lap(1)=do not clear file
     */
    url+='?logFile='+logFile+'&lap='+lap;
    var XMLdoc=ajaxPHP2(url,2);
    var xmlrows = XMLdoc.getElementsByTagName("line");

alert("xmlrows.length=="+xmlrows.length);
    // empty file
    if (xmlrows.length==0){
            var d = document.createElement('div');
            var s = document.createElement('span');
            s.innerHTML='...';
            d.appendChild(s);
            bigD.appendChild(d);
    } else {
            // Parse XML
            for (var i=0;i<xmlrows.length;i++){
                    if (xmlrows[i].childNodes[0]){
                            if (xmlrows[i].childNodes[0].nodeValue){
                                    var d = document.createElement('div');
                                    var s = document.createElement('span');

                                    s.innerHTML=xmlrows[i].childNodes[0].nodeValue;
                                    d.appendChild(s);
                                    bigD.appendChild(d);
                            }
                    }
            }
    }
    setTimeout(function(){feed_terminal(logFile,bigD,1)},2000);
}

其中最重要的项是setTimeout()调用,以继续到达php文件,该文件只返回文件中xml的行。

function ajaxPHP2(url,key)
{
    if (window.XMLHttpRequest) {
            xml_HTTP=new XMLHttpRequest();
            if (xml_HTTP.overrideMimeType) {xml_HTTP.overrideMimeType('text/xml');}
    } else { xml_HTTP=new ActiveXObject("Microsoft.xml_HTTP"); }
    xml_HTTP.open("GET",url,false);
    xml_HTTP.send(null);
    if (key){return xml_HTTP.responseXML;}
}

2 个答案:

答案 0 :(得分:2)

您需要告诉Javascript异步执行XHR调用。

更改

xml_HTTP.open("GET",url,false);

xml_HTTP.open("GET",url,true);

但首先,您需要告诉它在请求完成时执行某项操作(callback):

xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
        alert(xmlhttp.responseText);
    }
  }
xmlhttp.open("GET",url,true);
xmlhttp.send();

一个建议:XHR是一种痛苦。使用像jQuery's $.ajax()

这样的东西要容易得多

答案 1 :(得分:0)

您需要将ajax调用设置为异步。在ajaxPHP2函数中,行xml_HTTP.open("GET", url, false);是导致页面暂停的原因。 false参数告诉ajax调用使其他所有内容等待它。将false更改为true,如下所示:

xml_HTTP.open("GET", url, true);

您可能还需要将函数附加到onreadystatechange属性,以便在ajax调用返回时它知道该怎么做。有关详细信息,请参阅these links