开发者

ajax: don't wait for response, but check for it periodically

开发者 https://www.devze.com 2022-12-23 23:26 出处:网络
I have a PHP process that takes a long time to run. I don\'t want the AJAX process that calls it to wait for it to finish.When the PHP process开发者_JAVA技巧 finishes it will set a field in a database

I have a PHP process that takes a long time to run. I don't want the AJAX process that calls it to wait for it to finish. When the PHP process开发者_JAVA技巧 finishes it will set a field in a database. There should be some kind of AJAX polling call to check on the database field periodically and set a message.

How do I set up a jQuery AJAX call to poll rather than wait? Does the PHP script have to do anything special?


It's easier to have your server-side action, simply respond with a negative response until the value is ready and set up the client-side to repeatedly poll (with setTimeout()) until a positive response is received or a fixed number of failures is observed.

 var timer;
 var count = 0;
 function poll(url) {
      timer = setTimeout(function() {
          $.ajax({
              url: url,
              success: function(data) {
                  if (data.Status) {
                      ...do something...
                  }
                  else {
                     if (++count > 10) {
                       ...failure action...
                     }
                     else {
                         poll(url);
                     }
                  }
              ...other options...
           })
      },5000)
 }

Then on the server side use something that does (pseudocode) ...

 if operation is not complete
     return serialize( { Status : false } )
 else
     data = ....
     data.Status = true
     return serialize(data)
 end


Step 1: The first call to the long running process - Set ignore_user_abort(true); in the PHP script which takes a long time and close the connection.

Step 2: Check if the DB field is updated using the methods suggested.


One quick workaround would be to create another PHP script which you can call that will check for that, since accessing DBs directly thru AJAX's comm method is not a good practice.

  1. Create a PHP file, with the DB check required.
  2. Make it so it will post 'T' or 'F' or something like that
  3. Create a SetInterval('yourfunctionname',100) so you can call the polling script.
  4. If the answer fo that polling is 'T', call your other long-time script.


Do you mean usual polling (as opposed to long polling)? If yes, maybe this helps: http://jquery-howto.blogspot.com/2009/04/ajax-update-content-every-x-seconds.html

The PHP script would just check the database field, and return true/false immediately.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号