当for内部有查询时如何返回异步函数的值

Posted

技术标签:

【中文标题】当for内部有查询时如何返回异步函数的值【英文标题】:How to return a value of an async function when there's a query inside a for 【发布时间】:2022-01-15 07:47:37 【问题描述】:

我试图在 for 循环完成后返回一个值,for 循环位于异步函数内。 在循环内部,有一个插入到数据库的查询。

函数运行正常,但是当我使用邮递员时,响应返回空(即使值已插入数据库)

这是我调用函数的方式:

        insertarPracticas(turno_id,req.body.lista_codigos_practicas, queryInsertarPracticas)
        .then( result=> 
                 res.status(200).json(
                      "Practicas Agregadas": result
                    )
                 
        )

函数如下:

async function insertarPracticas(turno_id, req, queryInsertarPracticas)
//practicasAgregadas="";
return new Promise((resolve, reject) => 
    for (let i=0; i< req.length; i++) 
        connection.query(
            queryInsertarPracticas, [turno_id, req[i]],(error2, row2) =>  
                if (error2) 
                    console.log("Error al insertar turno detalle (prácticas): "+req[i] +" "+ error2);             
                    practicasNoAgregadas += req[i] + "-";                   
                else
                    console.log("Turnos detalle agregados "+req[i]);
                    practicasAgregadas += req[i] + "-"; 
                    console.log("practicas "+practicasAgregadas);
                
        );
        console.log("en for "+practicasAgregadas);
    
    resolve(practicasAgregadas)

    // Or of there was an error
    reject("error");
)

这里发生的情况是该函数不会等待连接查询结束,即使它向数据库插入值,在 Postman 上我得到第一个结果,它是空的:

但我的数据库中确实插入了值。

处理这个问题的正确方法是什么?我尝试过使用 map 而不是 for,现在我正在尝试使用 promise,但我不确定我是否正确使用它。

这是控制台,您可以在其中看到 console.log("en for" + practicasAgregadas) 在它应该有一些值时返回空。

【问题讨论】:

connection.query 是异步的。您应该使用Promise.all 等待所有这些查询完成 【参考方案1】:

我不知道您是如何构建连接文件的,但您应该将其更改为异步函数并等待 connection.query

【讨论】:

我没有连接文件,它只是一个常量:codeshare.io/zy6rwD【参考方案2】:

在你的地图之后,只需使用:

await Promise.all(yourArray);

【讨论】:

您的答案可以通过添加有关代码的作用以及它如何帮助 OP 的更多信息来改进。 @hakikayoub 谢谢!!!!!! @hakikayoub 我有一个问题,我能够让它返回 3 个值,它们返回 null。如何将值设置为 res 常量? codeshare.io/K8wexo

以上是关于当for内部有查询时如何返回异步函数的值的主要内容,如果未能解决你的问题,请参考以下文章

如何在颤动中返回异步函数的值?

js执行顺序+同步异步

如何在 readline 中定义异步函数

如何从Objective-C中的异步内部函数内部返回外部函数

如何从Objective-C中的异步内部函数内部返回外部函数

JavaScript:如何在异步内部函数中返回外部函数?