JavaScript use function as while loop condition

时间:2017-12-18 06:54:54

标签: javascript

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?

3 个答案:

答案 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();	
	}
}