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