JavaScript use function as while loop condition

Defined variable in global:

var domArray = [] //will have multiple string var onQueueDom = [] //will have 1 string only var onQueueDomStatus = ["N"] //will one of the status: "N", "P","D" var processedNum = 0 

I create a function which will return True or False, it will wait 3 seconds only run the if else:

function checkIfPending(){ console.log('checkIfPending being executed ') setTimeout(function(){ if(onQueueDomStatus[0] == "D"){ console.log("Process Done, returning True") return true console.log("True has been returned, you shouldn't seeing this") } else if(onQueueDomStatus[0] !== "D" || onQueueDomStatus[0] !== "N" && onQueueDom !== ""){ console.log("Still Processing, will re-check in 3 second") return false } else { console.log("No domain on Queue but status not clear") console.log("Clearing status...") onQueueDomStatus[0] = "D" console.log('setting onQueueDomStatus to ' + onQueueDomStatus[0]) console.log("Status changed to D & returning True") return true } }, 3000); } 

i want to use the above function as the condition of while loop, but it will not process the code in the While loop even the onQueueDomStatus[0] == "D":

while(checkIfPending() == true){ console.log('while loop is running') onQueueDomStatus[0] = "N" console.log('setting onQueueDomStatus to ' + onQueueDomStatus[0]) movetoQueue() console.log('Executing movetoQueue') } 

Assuming the onQueueDomStatus[0] is always "D", but it still not working.

Side question: is the while loop will wait 3 seconds to execute everytime?

5

3 Answers

checkIfPending has no return value, so calling it results in the value undefined. The callback you're passing setTimeout has a return value (though setTimeout ignores it), but checkIfPending does not. checkIfPending cannot return any value it derives from an asynchronous operation (more here).

while is a synchronous control-flow structure.* You can't use the result of an asynchronous function as the condition in a while.

Edit: gurvinder372 has done a good job of showing you how to restructure things to handle the asynchronicity.


* The semantics of while can be made asynchronous inside an ES2017+ async function if you use await, but under the covers, what really happens is that the function is rewritten not to use while.

3

You need to invoke callback instead of returning true or false

function checkIfPending( exitCallback, trueCallback ){ console.log('checkIfPending being executed ') setTimeout(function(){ if(onQueueDomStatus[0] == "D"){ trueCallback (); //invoke callback which signals that checkPending should continue checkIfPending( exitCallback, trueCallback ); } else if(onQueueDomStatus[0] !== "D" || onQueueDomStatus[0] !== "N" && onQueueDom !== ""){ exitCallback(); } else { onQueueDomStatus[0] = "D"; trueCallback (); //invoke callback which signals that checkPending should continue checkIfPending( exitCallback, trueCallback ); } }, 3000); } 

And use this as

checkIfPending( function(){ //console.log( "while loop ended" ); }, function(){ onQueueDomStatus[0] = "N"; movetoQueue(); }) 
1

This code will help you

function getPromise(){ return new Promise((resolve,reject)=>{ setTimeout(function(){ if(onQueueDomStatus[0] == "D"){ console.log("Process Done, returning True") resolve(true) } else if(onQueueDomStatus[0] !== "D" || onQueueDomStatus[0] !== "N" && onQueueDom !== ""){ console.log("Still Processing, will re-check in 3 second") resolve(false) } else { console.log("No domain on Queue but status not clear") console.log("Clearing status...") onQueueDomStatus[0] = "D" console.log('setting onQueueDomStatus to ' + onQueueDomStatus[0]) console.log("Status changed to D & returning True") resolve(true) } }, 3000); }) } async function final(){ var d = await getPromise(); // d will contain boolean after specified delay while(d == true){ onQueueDomStatus[0] = "N" movetoQueue(); d = await getPromise(); } }

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like