www.webdeveloper.com
Results 1 to 3 of 3

Thread: [RESOLVED] Issues with Callback / jQuery?

  1. #1
    Join Date
    Mar 2014
    Location
    UK
    Posts
    4

    resolved [RESOLVED] Issues with Callback / jQuery?

    Folks - my apologies first if this should have gone in the Javascript frameworks group, but it's a kind of hybrid Javascript / jQuery question so here goes!

    Firstly, please excuse the fairly length code snippet below - but I felt it pertinent to include all functions involved.

    I have a button on my web page that calls "initiateRun". From there, you can see what happens - waitForComplete looks to see if a process is running server side, while updateLogAndWait posts the latest output of that process to a textarea on the webpage, pauses, and then we repeat.... Or rather, this SHOULD be what happens.... In it's current form, the sequence of alerts I get is:
    GMS Data **STUFF**
    Process found
    Waiting 1s GMS=1 << and this is then repeated forever


    Bizarrely, If I add an additional alert "Looking for process" immediately after the "var wfcRequest = " in my WaitForComplete function I get:
    Looking for Process
    GMS Data **STUFF**
    Process found
    Waiting 1s GMS=1
    Looking for Process
    GMS Data **STUFF**
    Process found
    Waiting 1s GMS=1

    and so on, until my process has exited, at which point I get:
    Looking for Process
    GMS Data (nothing)
    NO Process found
    Waiting 1s GMS=1
    Looking for Process
    GMS Data (nothing)
    NO Process found
    Waiting 1s GMS=1

    and so on... for ever again.

    So - I'm stumped as to a) why I need the additional alert in order to "correctly resubmit" the wfcRequest jQuery, and b) why, when the process that getMarsStatus looks for has exited, I still end up caught in the loop?!?

    Can anyone suggest anything?

    Thanks!!


    Code:
        function initiateRun()
        {
            var logbox = document.getElementById("marsoutput");
            logbox.value = "";
            var request = $.get("initiateMars") // routes to a call to runSuites
            request.success(function(data, textStatus, jqXHR){
                waitForComplete();
                getMarsLog();
            })
            request.error(function(jqXHR, textStatus, errorThrown) {
                alert ("IR err: " + errorThrown);
            })
            sleep (3000)
        }
    
        function getMarsLog()
        {
            var gmlRequest = $.get("getMarsLog"); // routes to a call to getMarsOutput
            gmlRequest.success(function(data, textStatus, jqXHR){
                var logbox = document.getElementById("marsoutput");
                logbox.value = data;
            })
            gmlRequest.error(function(jqXHR, textStatus, errorThrown) {
                alert ("GML err: " + errorThrown);
            })
    
        }
    
        function waitForComplete()
        {
            var wfcRequest = $.get("getMarsStatus"); // routes to a call to checkForMarsProcess
            wfcRequest.success(function(data, textStatus, jqXHR){
                alert("GMS Data: " + data)
                if (data == "") {
                    alert("NO Process found");
                    updateLogAndWait(0);
                    return;
                }
                else{
                    alert("Process found");
                    updateLogAndWait(1);
                }
            })
            wfcRequest.fail(function(jqXHR, textStatus, errorThrown) {
                alert ("GMS err: " + errorThrown);
            })
        }
    
        function updateLogAndWait(GMS)
        {
            while (GMS == 1)
            {
                alert("Waiting 1s, GMS = " + GMS);
                sleep(1000);
                    getMarsLog();
                waitForComplete()
            }
            alert ("Exiting updateLogAndWait Loop")
        }

  2. #2
    Join Date
    Mar 2005
    Location
    Behind you...
    Posts
    1,016
    In your updateLogAndWait() function you use sleep(1000) to attempt to have the script wait for 1 second before checking the server again. However, sleep() is not a javascript/jQuery function thus it doesn't do anything.

    As for alert() seeming to help/fix part of your issue, typically when you see things like this it is because an alert() stops your script. The script does not resume until the alert dialog is closed by the user and so it often allows extra necessary time for something to work (when otherwise it would be running without delay).


    And lastly as for your seemingly endless loop after the process has exited... Well I'm guessing this is due to how you have the logic setup in updateLogAndWait(). You use a while() loop to check for a variable called GMS and as long as it is equal to 1, you continue to loop. Because GMS is an argument in the function, it will remain at 1 until it is changed (within the same instance of that function). This means calling the function a second time with the value 0 does absolutely nothing to affect the first time you ran the function. That instance is still running separately from the second instance and will continue to have a value of 1 for GMS.


    And before the obvious question comes in, since there is no sleep() command for javascript the solution is to use the setTimeout() function instead. Now this does require that you look at (and organize) your code slightly differently because setTimeout() is designed to delay the execution of code, not pause or create a delay while in the middle of code. In your case you would need to change how you call updateLogAndWait() to something like this:
    Code:
    function waitForComplete() {
    	var wfcRequest = $.get("getMarsStatus"); // routes to a call to checkForMarsProcess
    	wfcRequest.success(function(data, textStatus, jqXHR){
    		if (data == "") {
    			setTimeout(function(){ updateLogAndWait(0); }, 1000);
    		} else {
    			setTimeout(function(){ updateLogAndWait(1); }, 1000);
    		}
    	});
    	wfcRequest.fail(function(jqXHR, textStatus, errorThrown) {
    		console.log("GMS err: " + errorThrown);
    	});
    }
    And related to this, in order to fix your infinite loop while also adjusting your updateLogAndWait() function to fit this new method of calling it you would use something like:
    Code:
    function updateLogAndWait(GMS) {
    	if(GMS == 1) {
    		getMarsLog();
    		waitForComplete();
    	}
    }

    Also, for the record you should use console.log() instead of alert() in most cases if you are just trying to log and debug information via javascript. If you press F12 and click on the 'Console' tab you'll be able to view any information printed with console.log(). It's not as intrusive as an alert() and doesn't interfere with the execution of code.

  3. #3
    Join Date
    Mar 2014
    Location
    UK
    Posts
    4
    Ahh fantastic, thank you!

    As an aside, while I thought I had quoted all relevant functions, I hadn't - I did actually write a sleep function (or rather, pinched from the net!)... but the Timeout solution is far neater!

    Slowly but surely, my head is getting itself wrapped around callbacks. Slowly, but surely...

    Thanks again!

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
HTML5 Development Center



Recent Articles