0

I have a function that calls some service and returns the response. If the response is FALSE, it waits 1 second to ask the service again (which then probably returns TRUE).

How can I do to call my function "checkService()" once, and get the real value? (the first or second try, decided by the function) I set the RET value inside the function, but the functions always return the first RET, because the setTimeout is asynchronous.

In other words, I need some "sleep" trick, or any solution (may be jQuery too).

function checkService() {

  //this may return TRUE or FALSE
  var RET = someServiceResponse(); 

  // here waits 1 second, then ask the service again
  if( RET == true ) {
    return true;
  } else {

    setTimeout(
        function() {
            //it must return the second response of the service
            RET = someServiceResponse();  
        }, 
        1000
    );

    // I want the checkService() return the response after de timeout
    return RET;  
  }
}

function alertResponse() {
    alert( checkService() );
}
3
  • 1
    Is someServiceResponse getting its result from an ajax call? That may be the heart of your issue. Commented Aug 4, 2014 at 23:28
  • although the 1 sec wait seems useful, its easily broken if the call takes more time to return. I would recommend splitting up this functionality with a callback function that fires when the response is actually delivered. Commented Aug 4, 2014 at 23:31
  • Travis, no. However, I dont mind if waits takes more than 1 second. It's not important that time, just need to wait some (half second or so) and chek it again Commented Aug 5, 2014 at 0:04

2 Answers 2

3

You should use a callback function when you expect a result from the service.

Like this :

function checkService(callback) {

    //this may return TRUE or FALSE
    var RET = someServiceResponse();

    // here waits 1 second, then ask the service again
    if( RET == true ) {
        callback(RET);
    } else {

        setTimeout(
                function() {
                    //it must return the second response of the service
                    RET = someServiceResponse();
                    callback(RET);
                },
                1000
        );

        // I want the checkService() return the response after de timeout
        return RET;
    }
}

So when you want to call the service, you just need to do :

checkService(function(status){
    alert(status);

    // Here some code after the webservice response
});
Sign up to request clarification or add additional context in comments.

2 Comments

or call checkService() again in the timeout function. should work either way.
I've used alert() to simplify the thing. Actually I need to call checkService() from many other funcions in my code, and do whatever needed according to the response of checkService(). If I call it again from outside, I would doing the same that checkService() does. That's because I made the function checkService().
0

Googling 'javascript setTimeout callback' here's a handy jsFiddle about 3 results down:

getData('http://fakedomain1234.com/userlist', writeData);

document.getElementById('output').innerHTML += "show this before data ...";

function getData(dataURI, callback) {
    // Normally you would actually connect to a server here.
    // We're just going to simulate a 3-second delay.
    var timer = setTimeout(function () {
        var dataArray = [123, 456, 789, 012, 345, 678];
        callback(dataArray);
    }, 3000);
}

function writeData(myData) {
    console.log(myData);
}

http://jsfiddle.net/cwbuecheler/Y9Ca8/

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.