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

时间:2015-10-14 00:45:02

标签: 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 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

2 个答案:

答案 0 :(得分: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;
        }
    });
}

答案 1 :(得分:0)

jQuery Deferred 或者我们致电 Promise

  

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

示例: JSFIDDLE

文件: Deferred Object Promise

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