gpt4 book ai didi

node.js - 在 NodeJS 中使用异步函数进入循环?

转载 作者:太空宇宙 更新时间:2023-11-03 23:14:52 25 4
gpt4 key购买 nike

我必须检查foreignKey是否存在,但我无法使用异步查询函数进行循环

function checkAllFK(tables, foreignKeys) {
let index = -1;
for (var key in foreignKeys) {
index++;
QueryFunction(tables[index], key, foreignKeys[key])
.then(result => {
if(result == null) {
//here, if result is null, that's mean the foreignKey doesn't exist, then, we have to stop the loop and return false;
return false;
}
else if(index == (tables.length - 1)) {
//here, that's mean we are at the end of the loop, and we doesn't break it with the previous if, that's mean all foreignKey exist, then, we return true;
return true;
}
}

问题在于,在第一次迭代结束时,您退出函数,返回结果仅取决于第一次迭代:如果第一次迭代满足 if 条件则为 false,如果不满足则为 null

即使在这里查看了许多类似的主题,我也没有找到解决我的问题的方法。

最佳答案

您的操作“根据所有检查所有foreignKeys”可以写在一行中。

function checkAllFK(tables, foreignKeys) {
return Promise.all(tables.map(t => Promise.all(foreignKeys.map(k => QueryFunction(t, k))));
}

此函数返回一个在所有查询完成后解析的 promise ,因此您可以像这样调用它

checkAllFK(tables, foreignKeys)
.then(/* success */)
.catch(/* error */);

但是,根据foreignKeys 的数量以及QueryFunction 的复杂程度,这可能会给数据库服务器带来巨大的压力。如果有 10 个表和 1000 个外键,这将尝试对数据库服务器并行运行 10,000 个查询。这不是明智之举。

SQL 就是为了处理这些情况而设计的。您可以决定为 10,000 个事物运行一个查询,而不是为每个事物运行 10,000 个查询。或者 10 个查询,每个查询 1000 个事物。两者显然都比用 10,000 个请求来敲击数据库服务器要好。

例如,这一步返回 table_1 中不存在的所有外键。

SELECT
k.key_column
FROM
foreign_keys k
LEFT JOIN table_1 t ON t.key_column = k.key_column
WHERE
t.key_column IS NULL

这取决于您在 QueryFunction 中执行的操作,实际 SQL 需要是什么样子。

事实上,您有多个表来检查相同的外键,这一事实也令人担忧,这通常表明数据库设计不佳。

关于node.js - 在 NodeJS 中使用异步函数进入循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56791006/

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