progNewbie progNewbie - 6 months ago 8
Javascript Question

Polling: Do Get-Request until result suits

I have the following code:

$.get( "GetJobResult", { jobId: jobId }, function( answer ) {

})


If the "answer" is not "false" I want to wait like 20 seconds and do this request again to check if its now something else than "false".

I found many alike questions but after two hours I still can't figure out how to do that. Main problem is the "sleeping" for 20 seconds. If I dont't do that I get too many recursions if calling a function around the ajax-call when the answer comes.

Like:

function doCall( jobId , test) {
if (test == "false") {
$.get( "GetJobResult", { jobId: jobId }, function( answer ) {
// how to wait here?
doCall( jobId, answer );
});
}
}


I am a little bit stuck here. Can anyone help me? Thanks alot!

Edit:
I already tried setTimeout like this:

function doCall( jobId , test) {
if (test == "false") {
$.get( "GetJobResult", { jobId: jobId }, function( answer ) {
setTimeout(
doCall( jobId, answer ),
20000);
});
}
}

Answer

Have you looked into using setTimeout? That's how you would execute a function after waiting X milliseconds. So if you wanted to wait 5 seconds, you would do:

setTimeout(function(){ doCall( jobId, answer ); }, 5000)

The 5000 there is 5000 milliseconds. Does that help?

Edit: Just to clarify, the first argument in setTimeout has to be a function. So another way you could do this is:

setTimeout(doCall,5000)

But there's a problem here. setTimeout doesn't know what arguments you want. Instead we can create a new function that calls the doCall with the correct arguments:

var delayedCall = function(){
  doCall(jobId,answer)
}
setTimeout(delayedCall,5000)

That should work, and that's the same thing as:

setTimeout(function(){ doCall( jobId, answer ); }, 5000)

Except now we're creating a nameless function and passing it in at the same time.

Comments