gpt4 book ai didi

javascript - 如何从第二个 knex 查询内的 knex 查询访问变量?

转载 作者:行者123 更新时间:2023-11-29 16:27:41 27 4
gpt4 key购买 nike

我有以下路线,我想获取与从第一个查询获得的 id 关联的总和

app.post('/VerEmpresas', function (req, res) {

var r, dot, ide;

knex.from('empresas').select("id", "rut", "empresa", "razon_social", "email")
.then((rows) => {
for (row of rows) {

ide = row['id'];

knex.from('sucursales').sum("dotacion as SUM").where('id_empresas', '=', ide)
.then((q0) => {

dot = q0[0].SUM;
console.log(dot);
})
console.log(dot);
// do something here with dot

}

res.send();
})
})

第一个 console.log 显示正确的值,但第二个 console.log 显示未定义。如何在 then() 之外使用变量?

最佳答案

当您使用then时,您正在处理异步代码,这意味着程序遵循的路径不是线性的。您可以阅读有关如何从异步调用返回值的更多信息 here .

在您的情况下,第二个 console.log 在定义点之前运行。这可能听起来很奇怪,但是当第二个 console.log 运行时数据库调用还没有完成。为了在定义后使用点值,您必须将另一个 then 链接到同一个链。像这样的事情:

app.post('/VerEmpresas', function (req, res) {

var r, dot, ide;

knex.from('empresas').select("id", "rut", "empresa", "razon_social", "email")
.then((rows) => {
for (row of rows) {

ide = row['id'];

knex.from('sucursales').sum("dotacion as SUM").where('id_empresas', '=', ide)
.then((q0) => {

dot = q0[0].SUM;
console.log(dot);
})
.then(() => {
console.log(dot);
// do something here with dot
})
}

res.send();
})
})

第二个 then 在第一个之后运行。通常,您可以使用 return 和参数在 then 之间传递结果,但在您的情况下,您已在函数顶部用 var 声明了点,这使得它可以以这种方式使用。

您的代码还有两个问题,但它超出了此问题的范围:

  1. 循环内有异步调用。这可能会导致问题,因为循环可以立即启动所有异步调用。了解更多相关信息 here 。我建议您切换到 async/await,这是编排异步调用以使其看起来像同步代码的另一种方法。

  2. 您正在混合 SQL 和普通 JavaScript。在这种情况下,这可能是您想要的,但通常用 SQL 编写整个查询是正确的方法。尤其是 for 循环看起来很奇怪。循环第一个查询的整个结果与选择基本相同。

关于javascript - 如何从第二个 knex 查询内的 knex 查询访问变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54154918/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com