在Javascript中捕获Promise.all()的解决方案

在Javascript中捕获Promise.all()的解决方案,javascript,mongoose,promise,async-await,Javascript,Mongoose,Promise,Async Await,我使用数组的值作为参数进行mongoose查询。 所以我需要做很多查询。我想把它们保存在一个对象中,以保证以后在同一个函数中使用它 但是,下面的代码只打印“[未定义]”。但是,我知道第一个查询返回一个值,因为我以前单独测试过它,所以返回的未定义数组是错误的。 我现在甚至无法想象我做错了什么 async function buscarNoBdPorValorContido(model, atributo, valor, resposta){ var documentos = []

我使用数组的值作为参数进行mongoose查询。 所以我需要做很多查询。我想把它们保存在一个对象中,以保证以后在同一个函数中使用它

但是,下面的代码只打印“[未定义]”。但是,我知道第一个查询返回一个值,因为我以前单独测试过它,所以返回的未定义数组是错误的。 我现在甚至无法想象我做错了什么

 async function buscarNoBdPorValorContido(model, atributo, valor, resposta){
        var documentos = []
        var valores = valor.split(` `)
        documentos = await Promise.all(valores.map(async valor => {
                const query = model.find({url: {'$in': [new RegExp(`.*${valor}.*`, 'i')]}}) //Everything working here

            }))

            console.log(documentos) //Prints " [undefined] "       
 }

尝试在映射内的异步函数中返回查询

异步功能总线CARNOBDPORVALORCONTIDO(型号、atributo、valor、resposta){
var documentos=[]
var valores=valor.split(``)
documentos=wait Promise.all(valores.map)(异步valor=>{
return model.find({url:{'$in':[new RegExp(`.*${valor}.*`,'i')]})//这里一切正常
}))
console.log(documentos)//打印“[未定义]”
}
我已经这样解决了:

 async buscarNoBdPorValorContido(model, atributo, valor){
        var valores = valor.split(` `)
        var documentos = valores.map(value => {
            const query = model.find({url: {'$in': [new RegExp(`.*${value}.*`, 'i')]}})
            return query.exec() 
        })
        var resultados = await Promise.all(documentos)
        return resultados  

    },

Promise中的承诺。所有
均不返回任何内容。你只需要创建一个变量,就这样-它不再被使用了。您可能只需要
返回模型.find({url:{'$in':[new RegExp(
*${valor}..*
,'i')]})
而不是声明变量。如前所述,映射回调不会返回任何内容;它需要回报承诺
query
不是承诺,而是
query.exec()
返回承诺,因此需要编写
返回模型.find(…).exec()
valores.map(…)
将返回一个承诺数组,这正是
Promise.all()
所需要的。如果所有查询都成功,
documentos
将包含查询结果。如果任何一个查询失败,整个
Promise.all()
都将失败,因此您需要一个
try{}catch(error){}
结构来捕获和处理错误的可能性。“如何访问先前的Promise会导致.then()链?”-balderdash!你只需要返回箭头函数