JavaScript使用函数作为while循环条件

问题描述 投票:1回答:3

全局中定义的变量:

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

我创建一个将返回True或False的函数,它将等待3秒仅运行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);

}

我想使用上面的函数作为while循环的条件,但它不会处理While循环中的代码,即使是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')
            }

假设onQueueDomStatus [0]总是“D”,但它仍然不起作用。

问题:while循环是否每次都会等待3秒钟?

javascript
3个回答
2
投票

checkIfPending没有返回值,因此调用它会产生值undefined。你传递setTimeout的回调有一个回报值(虽然setTimeout忽略它),但checkIfPending没有。 checkIfPending不能返回它从异步操作(more here)派生的任何值。

while是一个同步控制流结构。*你不能使用异步函数的结果作为while中的条件。

编辑:gurvinder372done a good job向您展示如何重组事物以处理异步性。


*如果你使用whileasync的语义可以在ES2017 + await函数中异步,但在幕后,真正发生的是该函数被重写不使用while


1
投票

你需要调用回调而不是返回truefalse

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);
}

并用它作为

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

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();	
	}
}
© www.soinside.com 2019 - 2024. All rights reserved.