【问题标题】:javascript alert if process is still running如果进程仍在运行,则 javascript 警报
【发布时间】:2015-10-14 00:45:02
【问题描述】:

我想知道是否可以创建一个 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>

javascript 函数正在后端调用 perl 脚本

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

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

【问题讨论】:

  • 您在if [ -e $sem ] 上有一个竞争条件。如果两个进程都看到文件不存在怎么办?
  • @Karoly 对不起,我不明白这是怎么回事。你是说如果进程在同一个实例中执行?进程运行时只能有一个 .sem 文件,并且在 shell 脚本结束时它将删除此 .sem 文件
  • Reaaaaally 希望您正确地检查您的输入,上帝禁止有人更改表单以提交; rm / -rf 的部门...
  • @Daniel 即使有人更改了我认为不会执行的表单。调用 shell 脚本的 perl 脚本正在通过这个语句“sh survey/NGPsurvey.sh [lindex $argv 0]”传递变量,我相信它只会出错,并且在 shell 脚本上,变量应该匹配一个文本文件,它将连接其内容。

标签: javascript perl shell


【解决方案1】:

jQuery Deferred 或者我们叫Promise

deferred.always()
添加在 Deferred 对象被解析或拒绝时调用的处理程序。

示例: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
    });
}

【讨论】:

  • 此锁仅阻止从同一页面访问。例如。如果您打开一个新选项卡或其他用户连接,它就消失了......问题没有说明这是否可以,但由于他试图在后端这样做,我认为它不是。
【解决方案2】:

我不确定这是否是您的想法,但是为什么不在发送您的 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;
        }
    });
}

【讨论】:

  • 此锁仅阻止从同一页面访问。例如。如果您打开一个新选项卡或其他用户连接,它就消失了......问题没有说明这是否可以,但由于他试图在后端这样做,我认为它不是。
  • 不幸的是,当我尝试时,这个答案没有发出 javascript 警报,我还没有弄清楚原因,但它也完全停止调用 perlscript。
  • @oceanexplorer 感谢您在这方面的帮助。 perl 脚本在包含缺少的逗号后重新运行,但是即使我在同一个窗口浏览器上进行第二次提交,仍然没有 javascript 弹出消息,我想如果我打开不同的浏览器并提交,这也将不起作用在那里表单,而还有另一个正在处理的提交。
  • @Dren 你说得对,这是一个简单的解决方案,实际上只会阻止用户多次提交作业。为了涵盖多个选项卡、浏览器、用户的场景,您必须在服务器端实现一些东西来检查作业是否正在运行,如果是,则将结果返回给浏览器,浏览器可以向用户显示消息。您可以使用当前拥有的 ajax 查询并调整服务器代码来执行此操作。为了帮助我给出的示例,请看一下这个 fiddle jsfiddle.net/q8Qdb/363,它模拟了一个持续 3 秒的 ajax 查询。
  • @Dren 我对 PERL 一无所知,但是当工作完成时,您的后端代码是否真的返回了您的 ajax 请求?当请求返回状态码为 200 时,将调用 ajax 查询中的成功函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
相关资源
最近更新 更多