Как запустить JavaScript во время вызова AJAX? - PullRequest
0 голосов
/ 28 сентября 2011

При разработке веб-приложения, в котором я широко использую 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");

и вот где я терплю неудачу. Эта следующая строка не выполняется до тех пор, пока exec () в файле php не вернется в файл php, а файл php не вернется в javascript. Не то, чтобы это имело значение, но я почти уверен, что так раньше не было, так как изначально скрипт bash выполнялся в течение 2 минут, а JavaScript успешно обновлял html с помощью feed_terminal. это уже не так.

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.');

Ниже приведен код для ваших вопросов

В конечном счете, мой вопрос: как я могу запустить javascript во время вызова ajax? Или, может быть, у меня такой вопрос, как я могу заставить 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 ]

2 голосов
/ 28 сентября 2011

Вы должны указать Javascript сделать ваш XHR-вызов асинхронным.

Изменить

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

на

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

Но сначала вам нужно будет сказатьчто-то делать, когда запрос завершается (a 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 ()

0 голосов
/ 28 сентября 2011

Вам необходимо установить асинхронный вызов ajax. В функции ajaxPHP2 строка xml_HTTP.open("GET", url, false); является причиной остановки страницы. Параметр false сообщает ajax-вызову, чтобы все остальное его ожидало. Измените false на true, чтобы оно выглядело так:

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

Вам также может понадобиться присоединить функцию к свойству onreadystatechange, чтобы при возврате вызова ajax он знал, что делать. См. эти ссылки для получения дополнительной информации.

...