簡體   English   中英

如何在ajax中進行檢查和重新檢查,然后等待服務器消息的值更改?

[英]How to check and recheck within ajax and wait until the value of the server message changes?

我在一個應用程序上工作,當用戶單擊應用程序中的“保存”按鈕時,它將保存信息並重新啟動服務器。 在成功啟動ajax之前,必須成功提交表單。 如果信息從表格中正確保存,我會從服務器收到200條成功消息。

如果成功(200),服務器將重新啟動,當服務器重新啟動或正在重新啟動時,它會顯示500條內部服務器消息,重新啟動服務器大約需要30到40秒或更長時間,因此我等待30秒。服務器重新啟動,將顯示200成功的服務器消息。

當前,我正在使用Ajax調用2來檢查是否成功提交數據以重新啟動服務器,而另一個1st Ajax調用1來重新檢查服務器是否正在重新啟動並且數據已更新。

我目前有以下2個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);
            }
        }); 

阿賈克斯電話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);

            }
        });

    });
});



});

如果服務器發出500錯誤消息以檢查服務器是否重新啟動,並在返回到更新的頁面之前重新檢查200是否成功,是否可以在Ajax call 2成功范圍內連續進行重新檢查?

您可能只需要使用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.

好吧,我的想法可能是將您的ajax請求放入方法中並執行以下操作:


1.發送請求以保存數據並重新啟動服務器。

2.在此過程中,您需要驗證數據庫中是否沒有重復數據。

3.如果存在錯誤,則一次又一次執行該方法,但是由於編號2中實施的驗證,因此數據沒有被重復保存,只有服務器重新啟動。


首先,我對您的情況進行了模擬。 只是知道,我不知道您使用的是哪種服務器語言(因為在question tags未指定),但是我將使用PHP來簡化此工作...

以下示例說明了這一點:

用戶在文本框內輸入他/她的名字,然后當他/她單擊“保存”按鈕時,數據將被發送到服務器,並且在50s之后,回調將返回到客戶端。 但是,如果輸入名稱為oscar則服務器將返回500 HTTP錯誤,您將看到代碼如何再次執行以嘗試再次“重新啟動”服務器一次(請記住這是模擬操作)。 否則,一切都會返回200 HTTP OK。

  • 請閱讀代碼中的所有注釋,檢查瀏覽器控制台,如果可以,請對其進行測試!

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的ajax請求(只知道我使用的是1.7.2版)。

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

希望這可以幫助 :-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM