Javascript 等待异步函数返回true或false-如何检查返回值?

Javascript 等待异步函数返回true或false-如何检查返回值?,javascript,asynchronous,async-await,Javascript,Asynchronous,Async Await,我有一个异步函数songAlreadyInQueue,如果在数据库中找到ID,它将返回true,否则返回false。我想使用这样的函数: if(!songAlreadyInQueue(ref, id)){ // do stuff } 但我知道,由于它是一个异步函数,我必须等待结果返回,然后才能真正知道它是真是假。我上面所说的总是错误的,所以我尝试了以下方法: songAlreadyInQueue(ref, id).then((wasFound) => {

我有一个异步函数songAlreadyInQueue,如果在数据库中找到ID,它将返回true,否则返回false。我想使用这样的函数:

if(!songAlreadyInQueue(ref, id)){
  // do stuff
}
但我知道,由于它是一个异步函数,我必须等待结果返回,然后才能真正知道它是真是假。我上面所说的总是错误的,所以我尝试了以下方法:

songAlreadyInQueue(ref, id).then((wasFound) => {
                                console.log("wasfound = " + wasFound)
                                if(!wasFound){
                                    //do stuff
                                }
                            })
但这也不行。等待此异步函数完成的正确方法是什么?这就是我的异步函数的简化形式:

async function songAlreadyInQueue(requestQueueRef, requestID) {
    var querye = requestQueueRef.where("id", "==", requestID)
        .get()
        .then((snap) => {
            snap.docs.forEach(doc => {
                if (doc.exists) {
                    console.log("**************FOUND REQUEST IN QUEUE ALREADY!")
                    return true
                }
            })
            return false
        })
    return querye // not sure if correct. Is this "returning a promise"?
}

对于异步函数,应该使用wait而不是then,这样就不会创建另一个匿名函数。您是从匿名函数而不是异步函数返回的。试试这个

异步函数songalreadyinqueuerequestref,requestID{ var snap=wait requestQueueRef.whereid,==,requestID.get var=false; snap.docs.forEachdoc=>{ 如果存在文档{ 控制台。日志*************已在队列中找到请求! 找到=真 } } 返回发现
}你尝试过的不起作用的方法基本上是正确的。这样到底有什么不起作用?这是在回报承诺吗?yes@JosephSiblewasFound总是false,这是因为forEach回调的返回值不是falseconsidered@Phil哦,所以我对forEach回调返回true,而不是对songAlreadyInQueue返回true?使用wait或then并不是真正的问题,但您已经指出了forEach的问题,因为它是一个普通数组,我建议使用return snap.docs.some{exists}=>exists代替使用some并不是一个真正的改进,它只是一种甜点,我还需要解释一下。一个改进是使用真正的循环并尽早返回。也就是说,这绝对是这里真正的问题,正如我所写的,它将修复她在问题中展示的第二个实现。如果我错过了一些东西,你应该停止含糊不清,大声说出来。Array.prototype.some确实像你的循环建议一样提前返回。这就是我建议的原因我就是这么想的。你还需要回报你的承诺。使用async,它无论如何都会返回一个承诺。