2015-10-14 3 views
0

Я хотел бы знать, возможно ли его создать оповещение javascript, которое будет уведомлять пользователей о том, что есть предыдущая форма, и все еще обрабатываемый или исполняемый скрипт по-прежнему работает. Процесс выполнения обычно занимает 2-5 минут.javascript alert, если процесс все еще запущен

выдержка из 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-скрипт, в свою очередь, выполняет скрипт, и я добавил на раковине сценарий .sem-файл, чтобы запретить выполнение нескольких экземпляров. Но пользователи на интерфейсе не знают об этом.

отрывок из сценария PERL

$div = $FORM{division}; 

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

отрывок из сценария оболочки

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 $ семафор]'. Что делать, если два процесса видят, что файла нет? –

+0

@ Karoly im извините, я не понял, как это. вы говорите, что если процесс был выполнен в одном экземпляре? там может быть только один .sem-файл во время выполнения процесса, а в конце скрипта оболочки он удалит этот .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 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 
    }); 
} 
+0

Эта блокировка предотвращает доступ только с той же страницы. Например, если вы открываете новую вкладку или другой пользователь подключается, он ушел ... В вопросе не указано, все ли в порядке, но поскольку он пытается это сделать в бэкэнд, я предполагаю, что это не так. –

Смежные вопросы