2015-10-14 60 views
0

我想知道是否有可能创建一个JavaScript警报,提示用户以前的表单已提交,并且仍在处理中,或者后端脚本仍在运行。运行时进程通常需要2-5分钟。下面javascript alert如果进程仍在运行

  <form id="form" method="POST"> 
      <p id="survey"> 
       <label for="list"><b>Run survey to check number of NGPOS deployed</b></label> 
      </p> 
      <p> 
       <label for="division">Please select division:</label> 
       <select type="list" id="list" name="division"> 
        <option>--Select One--</option> 
        <option value="DENVER">Denver</option> 
        <option value="PHOENIX_SOUTHWEST">Phoenix-Southwest</option> 
        <option value="PORTLAND">Portland</option> 
        <option value="SOUTHERN_HOUSTON">Southern-Houston</option> 
        <option value="NORCAL">Norcal</option> 
        <option value="SEATTLE">Seattle</option> 
        <option value="VONS_SoCal">Vons-Socal</option> 
        <option value="EASTERN">Eastern</option> 
       </select> 
      </p> 
      <p id="survey"> 
       <input type="submit" value="Run Survey" onclick="surveyFunction();"/> 
      </p> 
      </form> 

摘录html代码的JavaScript函数在后端

function surveyFunction(){ 
var div = document.getElementById("list").value; 
$.ajax({ 
    type: "POST", 
    url: "possurv.pl", 
    data: 'division=' + encodeURIComponent(div), 
}); 
} 

反过来perl脚本执行一个shell脚本中调用一个Perl脚本,我加上了外壳脚本.sem文件禁止执行多个实例。但前端用户无法知道这一点。

摘录perl脚本的

$div = $FORM{division}; 

$expect = `./expect.sh $div`; 

shell脚本摘录

sem="${log_path}/pos_survey.sem" 

echo $0 "started." 
if [ -e $sem ] 
then 
    echo $0 "still running, exiting." 
    exit 1 
else 
    touch $sem 
fi 
+1

您对'如果[-e $ SEM]'的竞争条件。如果两个进程都看到该文件不在那里呢? –

+0

@Kolyoly我很抱歉,我不明白这是怎么回事。你是否在说如果这个过程在同一个实例中被执行?在进程运行时只能有一个.sem文件,并且在shell脚本的末尾会删除这个.sem文件 – Dren

+0

Reaaaaally希望你能够正确理智/检查你的输入,上帝禁止有人改变表单提交一个'; rm/-rf' ... –

回答

0

我不知道如果这是你脑子里想的是什么,但为什么你的Ajax查询之前不设置变量被发送,表示您正在处理并在处理完成后更改该变量并返回到您的ajax查询的成功函数。

var processing = false; 

function surveyFunction(){ 

    if(processing) { 
     return alert('A survey is still being processed'); 
    } 

    var div = document.getElementById("list").value; 

    $.ajax({ 
     type: "POST", 
     url: "possurv.pl", 
     data: 'division=' + encodeURIComponent(div), 
     beforeSend: function() { 
      processing = true; 
     }, 
     success: function() {     
      processing = false; 
     } 
    }); 
} 
+0

此锁只能阻止来自同一页面的访问。例如。如果你打开一个新标签或者其他用户连接,它就会消失......问题没有说明这是否正确,但是由于他试图在后端执行此操作,因此我认为它不是。 –

+0

不幸的是,这个答案没有给出一个JavaScript警告,当我尝试,我还没有找出原因,但它也完全停止调用perlscript。 – Dren

+0

@oceanexplorer在此感谢您的帮助。 perl脚本在包含缺少的逗号后重新运行,但是仍然没有javascript弹出消息,即使我在同一个窗口浏览器上进行了第二次提交,我想这也不起作用,如果我打开不同的浏览器并提交在那里还有另一个提交正在处理中。 – Dren

0

jQuery Deferred或者我们叫Promise

deferred.always()
添加处理程序当递延对象是解决或拒绝被调用。

例子:JSFIDDLE

文件:Deferred ObjectPromise

var lock = false; 
function surveyFunction() { 
    if (lock) { 
     console.debug('please wait'); 
     return false; 
    } 
    lock = true; 
    var div = document.getElementById("list").value; 
    return $.ajax({ 
     type: "POST", 
     url: "possurv.pl", 
     data: 'division=' + encodeURIComponent(div) 
    }).always(function() { 
     console.debug('complete'); 
     lock = false 
    }); 
} 
+0

此锁只能防止从同一页面访问。例如,如果您打开新的选项卡或其他用户连接,它走了......这个问题并没有说明这是否正常,但是由于他试图在后端做到这一点,我认为它不是。 –

相关问题