0

私はアプリケーションで作業しています。ユーザーがアプリケーションの[保存]ボタンをクリックすると、情報が保存され、サーバーが再起動します。ajaxが成功する前に、フォームを正常に送信する必要があります。情報がフォームから正しく保存されている場合、サーバーから200の成功メッセージが表示されます。

サーバーの再起動が成功(200)した場合、サーバーを再起動するか再起動すると、500の内部サーバーメッセージが表示されます。サーバーの再起動には約30〜40秒以上かかるため、30秒待ちます。サーバーが再起動すると、200成功サーバーメッセージが表示されます。

現在、 Ajax呼び出し2を使用して、サーバーの再起動のためのデータ送信が成功したかどうかを確認し、他の1番目のAjax呼び出し1を使用して、サーバーが再起動し、データが更新されていることを再確認しています。

私は現在、次の2つのajaxコードを持っています

Ajaxコール1

 $.ajax({
           // dataType : 'jsonp',
            //jsonp : 'js',
            url: "some.json",
            beforeSend : function(jqXHR, settings) {
                console.info('in beforeSend');
                console.log(jqXHR, settings);
            },
            error : function(jqXHR, textStatus, errorThrown) {
                alert(" 500 top data still loading"+ jqXHR +  " : " + textStatus +  " : " + errorThrown);
                console.info('in error');
                console.log(jqXHR, textStatus, errorThrown);
            },
            complete : function(jqXHR, textStatus) {
             alert(" complete "+ jqXHR +  " : " + textStatus);
                console.info('in complete');
                console.log(jqXHR, textStatus);
            },
            success: function(data, textStatus, jqXHR){
            alert(" success "+ jqXHR +  " : " + textStatus);
                console.info('in success');
                console.log(data, textStatus, jqXHR);
            }
        }); 

Ajaxコール2

 $(function () {
    $("#save").click(function () {

        $.ajax({
            type: "POST",
            url: "some.json",
            data: json_data,
            contentType: 'application/json',
            success: function (data, textStatus, xhr) {
                console.log(arguments);
                console.log(xhr.status);
                alert("Your changes are being submitted: " + textStatus + " : " + xhr.status);
                $('#myModal').modal('hide');
                /*                   
        This gives a messagthat  the server is restarting iina modal window and waits for 30sec
        */
                $('#myModal-loading').modal('show');

/***  Re check bit by Ryan ***/
var restartCheck = window.setInterval(
$.ajax({
    // dataType : 'jsonp',
    //jsonp : 'js',
    url: "../../../../../rest/configuration",
    beforeSend: function (jqXHR, settings) {
        console.info('in beforeSend');
        console.log(jqXHR, settings);
    },
    error: function (jqXHR, textStatus, errorThrown) {
        alert(" 500 top data still loading " + jqXHR + " : " + textStatus + " : " + errorThrown);
        console.info('in error');
        console.log(jqXHR, textStatus, errorThrown);

    },
    complete: function (jqXHR, textStatus) {
        alert(" complete " + jqXHR + " : " + textStatus);
        console.info('in complete');
        console.log(jqXHR, textStatus);
    },
    success: function (data, textStatus, jqXHR) {
        window.clearInterval(restartCheck);
        alert(" success " + jqXHR + " : " + textStatus);
        console.info('in success');
        console.log(data, textStatus, jqXHR);
    }
}), 30000); //This will call the ajax function every 3 seconds until the clearInterval function is called in the success callback.
/*** recheck bit **/

                setTimeout(function () {
                    location.reload(true);
                }, 30000);

                $('<div id="loading">Loading...</div>').insertBefore('#myform-wiz');

            },

            error: function (jqXHR, textStatus, errorThrown) {
                alert(jqXHR.responseText + " - " + errorThrown + " : " + jqXHR.status);

            }
        });

    });
});



});

Ajax call 2サーバーがサーバーの再起動をチェックするために500エラーメッセージを表示し、更新されたページにリダイレクトする前に200の成功を再チェックする場合、成功の範囲内で継続的に再チェックすることは可能ですか?

4

2 に答える 2

1

おそらくsetIntervalを使用できます。成功のコールバックでクリアすることを忘れないでください。

var restartCheck = window.setInterval(    
$.ajax({
           // dataType : 'jsonp',
            //jsonp : 'js',
            url: "some.json",
            beforeSend : function(jqXHR, settings) {
                console.info('in beforeSend');
                console.log(jqXHR, settings);
            },
            error : function(jqXHR, textStatus, errorThrown) {
                alert(" 500 top data still loading"+ jqXHR +  " : " + textStatus +  " : " + errorThrown);
                console.info('in error');
                console.log(jqXHR, textStatus, errorThrown);

            },
            complete : function(jqXHR, textStatus) {
                alert(" complete "+ jqXHR +  " : " + textStatus);
                console.info('in complete');
                console.log(jqXHR, textStatus);
            },
            success: function(data, textStatus, jqXHR){
                window.clearInterval(restartCheck);
                alert(" success "+ jqXHR +  " : " + textStatus);
                console.info('in success');
                console.log(data, textStatus, jqXHR);
            }
        })
, 3000);  //This will call the ajax function every 3 seconds until the clearInterval function is called in the success callback.
于 2012-12-03T04:12:16.763 に答える
0

さて、私の考えはajax、メソッド内にリクエストを入れて、次のことを行うことかもしれません。


1.データを保存してサーバーを再起動するリクエストを送信します。

2.このプロセスでは、データがデータベースで繰り返されていないことを検証する必要があります。

3.エラーが存在する場合、メソッドは何度も実行されますが、番号2で実装された検証のためにデータが二重に保存されず、サーバーのみが再起動されます。


このすべてを開始するために、私はあなたの状況のシミュレーションを行いました。知っておくと、使用しているサーバー言語の種類はわかりませんが(質問で指定されていないためtags)、これを簡単にするために使用PHPします...

次の例はこれを行います:

ユーザーがテキストボックス内に自分の名前を入力し、[保存]ボタンをクリックすると、データがサーバーに送信され50s、コールバックがクライアント側に返されます。ただし、入力名がのoscar場合、サーバーはエラーを返し、サーバー500 HTTPをもう一度「再起動」しようとするコードがどのように再実行されるかを確認できます(シミュレーションであることを忘れないでください)。それ以外の場合は、すべてOKが返され200 HTTPます。

  • コード内のすべてのコメントを読み、ブラウザコンソールを確認し、可能であれば...テストしてください。

index.php:これはメインページです。

<html>
<head>
<title>Simulation</title>
</head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
  $('#btn').click(function() {
     save();
  });
});

function save() {

    $('#msg').text('Please wait while restarting the server...').show();
    $('#btn').hide();

    $.ajax({
        type: 'POST',
        url: 'process.php',
        data: $('form').serialize(),
        statusCode: {
            500: function() { 

                console.log('500 HTTP error present, try again...');

                /* Invoke your method again to try restarting the server. 
                 * To avoid double save of 'name' variable please 
                 * check the first comments at 'process.php' file.
                 */
                $('#msg').text('Re-trying to restart the server...');

                /* While waiting check the browser console and look that 
                 * the save method is getting invoked again and again until 
                 * you change the name from 'oscar' to another.
                 */
                save();
            },
            200: function() {
                $('#msg').text('Server restarted!').fadeOut('slow');
                $('#btn').fadeIn();
            }
        }
    });

};
</script>
<body>
<span id="msg"></span>
<br/>
<form>
Name: <input type="text" name="name" id="name"/><br/>
<input type="button" name="btn" id="btn" value="Save"/>
</form>
</body>
</html>

process.php:このファイルはjQueryからリクエストを受け取ります(バージョン1.7.2ajaxを使用していることを知っておいてください)。

<?php
if(isset($_POST['name'])){

  $name = $_POST['name'];

  /* TODO: In this case and at this point, you need to save the 
   * name into DB but only if it doesn't exist because if 500 error
   * is present, then the request have to be validated again to 
   * just restart the server (maybe doing some if/else to evaluate) and 
   * don't make a double save.
   */

  /* TODO: restart the server... 
   * I will simulate the long wait for the server to respond (50s)
   * using sleep before sending back the name variable to client side.
   *
   * But!
   * I will do a tricky thing at this point. If the name is 'oscar' then
   * I will produce a 500 HTTP error to see what happens at client side...
   */

   /* Wait first 27s */
   sleep(27);

   /* If $name is 'oscar' then return 500 error */
   if($name == 'oscar') {
    throw new Exception('This is a generated 500 HTTP server error.');
   }

   /* If $name != 'oscar' then wait 23s to simulate 
    * the long time for restarting server...
    */
    sleep(23);

    flush();

    /* Retun $name in the callback */
    echo $name;  
}
?>

お役に立てれば :-)

于 2012-12-03T04:32:50.053 に答える