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

Posted

技术标签:

【中文标题】在 Javascript 中捕获 Promise.all() 的解决方案【英文标题】:Capture the solution of Promise.all() in Javascript 【发布时间】:2020-10-03 14:04:39 【问题描述】:

我正在使用数组的值作为参数进行猫鼬查询。 所以我需要做很多查询。而且我想将它们保存在一个对象中,以便以后在同一个函数中使用它。

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

 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] "       
 

【问题讨论】:

Promise.all 中的承诺不返回任何内容。您只需创建一个变量,仅此而已 - 它不再使用。您可能只需要 return model.find(url: '$in': [new RegExp(.*$valor.*, 'i')]) 而不是声明变量。 如所写,地图回调不返回任何内容;它需要返回 Promise。 query 不是 Promise 但 query.exec() 返回 Promise,因此你需要写 return model.find(.....).exec(); valores.map(...) 将因此返回一个承诺数组,这正是Promise.all() 所需要的。如果所有查询都成功,documentos 将包含查询结果。如果任何一个查询失败,整个Promise.all() 将失败,因此您需要一个try catch(error) 结构来捕获和处理错误的可能性。 “我如何在 .then() 链中访问之前的承诺结果?”的副本- 胡言乱语! 你只需要在箭头函数内返回 【参考方案1】:

尝试在 map 内的异步函数中返回查询。

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

            ))

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

【讨论】:

【参考方案2】:

我已经这样解决了:

 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  

    ,

【讨论】:

以上是关于在 Javascript 中捕获 Promise.all() 的解决方案的主要内容,如果未能解决你的问题,请参考以下文章

[万字详解]JavaScript 中的异步模式及 Promise 使用

如何在 Promise 的回调中捕获未捕获的异常

是否有可能在 Promise.all 中捕获所有被拒绝的承诺? [复制]

Promise.catch() 不会在 AngularJS 单元测试中捕获异常

React setState 未能捕获被拒绝的 Promise

Promise 在应该捕获错误时解决