全局中定义的变量:
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秒钟?
checkIfPending
没有返回值,因此调用它会产生值undefined
。你传递setTimeout
的回调有一个回报值(虽然setTimeout
忽略它),但checkIfPending
没有。 checkIfPending
不能返回它从异步操作(more here)派生的任何值。
while
是一个同步控制流结构。*你不能使用异步函数的结果作为while
中的条件。
编辑:gurvinder372有done a good job向您展示如何重组事物以处理异步性。
*如果你使用while
,async
的语义可以在ES2017 + await
函数中异步,但在幕后,真正发生的是该函数被重写不使用while
。
你需要调用回调而不是返回true
或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);
}
并用它作为
checkIfPending( function(){
//console.log( "while loop ended" );
}, function(){
onQueueDomStatus[0] = "N";
movetoQueue();
})
这段代码可以帮到你
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();
}
}