在Javascript中捕获Promise.all()的解决方案
我使用数组的值作为参数进行mongoose查询。 所以我需要做很多查询。我想把它们保存在一个对象中,以保证以后在同一个函数中使用它 但是,下面的代码只打印“[未定义]”。但是,我知道第一个查询返回一个值,因为我以前单独测试过它,所以返回的未定义数组是错误的。 我现在甚至无法想象我做错了什么在Javascript中捕获Promise.all()的解决方案,javascript,mongoose,promise,async-await,Javascript,Mongoose,Promise,Async Await,我使用数组的值作为参数进行mongoose查询。 所以我需要做很多查询。我想把它们保存在一个对象中,以保证以后在同一个函数中使用它 但是,下面的代码只打印“[未定义]”。但是,我知道第一个查询返回一个值,因为我以前单独测试过它,所以返回的未定义数组是错误的。 我现在甚至无法想象我做错了什么 async function buscarNoBdPorValorContido(model, atributo, valor, resposta){ var documentos = []
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()因此,code>valores.map(…)
将返回一个承诺数组,这正是Promise.all()
所需要的。如果所有查询都成功,documentos
将包含查询结果。如果任何一个查询失败,整个Promise.all()
都将失败,因此您需要一个try{}catch(error){}
结构来捕获和处理错误的可能性。“如何访问先前的Promise会导致.then()链?”-balderdash!你只需要返回箭头函数