gpt4 book ai didi

Javascript - 将先前的查询结果传递到 next.then()

转载 作者:行者123 更新时间:2023-11-29 21:01:29 25 4
gpt4 key购买 nike

我正在使用 knex 链接查询以将额外数据添加到我的 JSON 返回对象。但是我似乎无法理解为什么我不能将结果从一个 knex.query 传递到第二个 knex 查询的 .then()。

代码:

 exports.getApps = function() {
return new Promise(function(resolve, reject) {
db.raw(`
SELECT *
FROM APPs
WHERE VARAPP_PUBLIC_ACTIVE > 0
ORDER BY VARAPP_PUBLIC_ACTIVE ASC, VARAPP_NAME ASC
`).then(function(results) {
if (results[0].length > 0) {
for (var i = 0; i < results[0].length; i++) {
db.raw(`
SELECT *
FROM APPs_Features
WHERE VARAPP_ID = ?
ORDER BY VARAPP_ORDER ASC
`, [results[0][i].VARAPP_ID], i)
.then(function(features, currentIndex) {
if (features[0].length > 0) {
console.log(results[0]);
console.log(features[0]);

results[0][currentIndex].Features = features[0];
} else {
results[0][currentIndex].Features = null;
}

}).catch(function(err) {
console.error(err);
reject(err);
});

}

resolve({
apps: results[0]
})
} else {
resolve({
error: 'No Apps Found'
})
}
}).catch(function(err) {
console.error(err);
reject(err);
});
})
}

这是我的完整代码,如您所见,我正在尝试查询应用程序表,.then() 循环结果,然后查询 Apps_features 表,然后注入(inject)功能结果到原始查询结果中。我收到一条错误消息。

TypeError: Cannot set property 'Features' of undefined
at C:\Sites\VARNET_Vars\content\appList.js:21:40

最佳答案

这取决于 i值,而不是链接。

这个循环会立即执行:

for (var i = 0; i < results[0].length; i++)

所以 i将等于 results[0].length当内心的 promise 得到解决时。您可以轻松地测试它,尝试将其指定为静态以检查它是否有效:

results[0][i].Features = features[0];

为了修复它,您必须将当前 i 传递给内部 promise 调用和返回值,以便在解决 promise 时不使用已经设置为最大值的值。

所以你可以这样做:

exports.getApps = function() {
return new Promise(function(resolve, reject) {
db.raw(`
SELECT *
FROM APPs
WHERE VARAPP_PUBLIC_ACTIVE > 0
ORDER BY VARAPP_PUBLIC_ACTIVE ASC, VARAPP_NAME ASC
`).then(function(results) {
if (results[0].length > 0) {
for (var i = 0; i < results[0].length; i++) {
elaborate(i, results, reject);
}
resolve({
apps: results[0]
})
} else {
resolve({
error: 'No Apps Found'
})
}
}).catch(function(err) {
console.error(err);
reject(err);
});
})

function elaborate(i, results, reject) {
db.raw(`
SELECT *
FROM APPs_Features
WHERE VARAPP_ID = ?
ORDER BY VARAPP_ORDER ASC
`, [results[0][i].VARAPP_ID], i)
.then(function(features) {
if (features[0].length > 0) {
results[0][i].Features = features[0];
} else {
results[0][i].Features = null;
}

}).catch(function(err) {
console.error(err);
reject(err);
});
}
}

关于Javascript - 将先前的查询结果传递到 next.then(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46242984/

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