在开发一个我正在充分利用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;}
}
答案 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)