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?
53 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.
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(); }) 1This 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(); } }