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?
答案 0 :(得分:2)
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
.
答案 1 :(得分:1)
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();
})
答案 2 :(得分:1)
此代码可以帮助您
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();
}
}