Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果进程仍在运行,则发出javascript警报_Javascript_Perl_Shell - Fatal编程技术网

如果进程仍在运行,则发出javascript警报

如果进程仍在运行,则发出javascript警报,javascript,perl,shell,Javascript,Perl,Shell,我想知道是否有可能创建一个javascript警报,提示用户有以前提交的表单,并且表单仍在处理中,或者后端脚本仍在运行。运行过程通常需要2-5分钟 下面是html代码的摘录 <form id="form" method="POST"> <p id="survey"> <label for="list"><b>Run survey to check number of N

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

下面是html代码的摘录

            <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>
perl脚本依次执行一个shell脚本,我在shell脚本上添加了一个.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

我不确定这是否是您的想法,但为什么不在发送ajax查询之前设置一个变量,表示您正在处理并在处理完成后更改变量,然后返回ajax查询的success函数呢

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;
        }
    });
}

jQuery延期
或者我们称之为
承诺

延迟。始终()
添加在解析或拒绝延迟对象时要调用的处理程序

示例:

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
    });
}
文档:

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
    });
}

如果[-e$sem],则在
上有一个竞态条件。如果两个进程都看到文件不在那里怎么办?@Karoly对不起,我不明白这是怎么回事。你是说如果进程在同一个实例上执行?进程运行时只能有一个.sem文件,在shell脚本的末尾,它将删除该文件。sem文件真希望您正确地检查了输入,上帝禁止有人更改表单以提交
分区;rm/-rf
。@Dren:@Daniel即使有人修改了表格,我也不认为会执行。调用shell脚本的perl脚本正在通过以下语句传递变量“sh survey/NGPsurvey.sh[lindex$argv 0]”。我相信它会出错,在shell脚本上,变量应该匹配一个文本文件,该文本文件将连接其内容。此锁仅阻止从同一页面访问。例如,如果您打开一个新选项卡或其他用户连接,则该选项卡将消失。。。问题并没有具体说明这是否正常,但由于他正试图在后端执行此操作,所以我认为不是。此锁仅阻止来自同一页面的访问。例如,如果您打开一个新选项卡或其他用户连接,则该选项卡将消失。。。问题没有具体说明这是否可以,但由于他正试图在后端执行此操作,我认为不可以。不幸的是,当我尝试时,此答案没有发出javascript警报,我也不知道为什么,但它也完全停止调用perlscript。@oceanexplorer感谢您在这方面的帮助。perl脚本在包含缺少的逗号后重新运行,但是即使我在同一个窗口浏览器上进行第二次提交,仍然没有javascript弹出消息,如果我打开另一个浏览器并提交表单,而还有另一个提交正在处理中,我想这也不会起作用。@Dren你说得对,这是一个简单的解决方案,实际上只会防止用户多次提交作业。为了涵盖多个选项卡、浏览器和用户的场景,您必须在服务器端实现一些功能,以检查作业是否正在运行,如果正在运行,则向浏览器返回结果,浏览器可以向用户显示消息。您可以使用当前的ajax查询并修改服务器代码来实现这一点。为了帮助理解我给出的示例,请看一看这把小提琴,它模拟了一个持续3秒的ajax查询。@Dren我对PERL一无所知,但您的后端代码是否在工作完成后实际返回了ajax请求?当返回状态代码为200的请求时,将调用ajax查询中的success函数。