PrimuS
PrimuS

Reputation: 2683

Get Status from PHP /w two ajax calls

Given two api endpoints in my php backend:

Long Function Endpoint: /_api/_long_function & Status Endpoint: /_api/_status_long_function

In the LongFunction I write session data and in StatusFunction I read them and output them in json. I think it is not relevant to the question but I could show the session getting and setting as well if needed.

I now wanted to start the long function with an ajax call and then periodically request the status with a second ajax call.

The JS Code

$(document).on("click", "#submitSummoner", function () {

    ...INIT VARS...

    /**
     * Periodically check Session Status
     */
    var to,
        clearTime = false,
        called = 0,
        set_delay = 1000,
        callout = function () {
            console.log('Called SessionCheck ' + called);
            $.get($url_session, {
                my_data: my_data
            })
                .done(function (response) {
                    if (called === 0) {
                        console.log('Called LongFunction');
                        $.get($url, {
                            my_data, my_data
                        }).done(function (data) {
                            console.log('Finished Request');
                            if (to) {
                                clearTimeout(to);
                                clearTime = true;
                            }
                        }).fail(function () {
                            if (to) {
                                clearTime = true;
                                clearTimeout(to);
                            }
                            console.log('Failed Request');
                        });
                    }
                    called++;
                    // This is the output I need
                    console.log('Current Status: '+response.status);
                })
                .always(function () {
                    if (clearTime === false) {
                        to = setTimeout(callout, set_delay);
                    }
                });
        };

    callout();
});

Unfortunately what happens now is this:

Console Output

1: Called SessionCheck 0

2: Called LongFunction (immediately after)

3: Current Status: Whatever (immediatley)

4: Called SessionCheck 1 (immidately)

LONG PAUSE UNTIL LONG FUNCTION FINISHED

5: Current Status: Finished

after Finished the setTimout gets cleared as expected.

But why does the the setTimeout not get called every 1000ms altough the long function takes 10000ms+?

It seems like the second SessionCheck waits for the Long Check to finish, I don't know why? Is it possible that the server "hangs", CPU/RAM seem fine during the longFunction. Anything else that could "lock" it

Even it the php session check function crashes, shouldn't the function still try it again after 1000ms?

Any hint appreciated!

Solution

I figured it out, the session wasn't saving properly in the LongFunction: https://codingexplained.com/coding/php/solving-concurrent-request-blocking-in-php

Upvotes: 1

Views: 46

Answers (1)

piisexactly3
piisexactly3

Reputation: 779

I've re-written your solution using jQuery promises to simulate the get requests, and it works as you desired. I believe this proves the issue is on the back-end, that the "short" get request is not resolving the 2nd time. Please provide the code that resolves that request.

var to,
  clearTime = false,
  called = 0,
  set_delay = 1000,
  callout = function () {
      console.log('Called SessionCheck ' + called);
      
      var shortGet = $.Deferred();
      shortGet
          .done(function () {
              if (called === 0) {
               
                  var longGet = $.Deferred();
                  
                  console.log('Called LongFunction');
                  longGet.done(function (data) {
                      console.log('Finished Request');
                      if (to) {
                          clearTimeout(to);
                          clearTime = true;
                      }
                  }).fail(function () {
                      if (to) {
                          clearTime = true;
                          clearTimeout(to);
                      }
                      console.log('Failed Request');
                  });
                  
                  
                 setTimeout(function() {
                    longGet.resolve();
                 }, 10000);
              }
              called++;
              // This is the output I need
              console.log('Current Status: still going');
          })
          .always(function () {
              if (clearTime === false) {
                  to = setTimeout(callout, set_delay);
              }
          });
     setTimeout(function() {
        shortGet.resolve();
     }, 200);
  };

callout();
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

Upvotes: 1

Related Questions