Javascript 基于承诺的递归函数中的问题
我正在使用nodejs环境处理awslambda。我有一个API,我在其中使用递归函数实现一些功能 实际上大多数人都说避免递归函数,但根据我的功能,我需要这个。我的功能如下 我有一个表Javascript 基于承诺的递归函数中的问题,javascript,node.js,recursion,promise,aws-lambda,Javascript,Node.js,Recursion,Promise,Aws Lambda,我正在使用nodejs环境处理awslambda。我有一个API,我在其中使用递归函数实现一些功能 实际上大多数人都说避免递归函数,但根据我的功能,我需要这个。我的功能如下 我有一个表table1,其中有两列pid和cid,它们被定义为唯一约束。这意味着两列的组合应该是唯一的 因此,如果我在表1中插入任何组合,并且该组合已经存在,那么它会给我重复输入错误,这根据我的功能是正确的 所以为了处理这个重复输入错误,我使用了try..catch块。所以在catch块中,我检查了是否发生了重复条目错误,然
table1
,其中有两列pid和cid,它们被定义为唯一约束。这意味着两列的组合应该是唯一的
因此,如果我在表1
中插入任何组合,并且该组合已经存在,那么它会给我重复输入错误,这根据我的功能是正确的
所以为了处理这个重复输入错误,我使用了try..catch块。所以在catch块中,我检查了是否发生了重复条目错误,然后调用一个递归函数,尝试不同的组合,直到在表1
中创建新条目
我的递归函数是基于承诺的。但当成功创建新条目时,我正在解决承诺。但promise并没有从我第一次调用递归函数的地方返回。正因为如此,超时才会发生
所以,请有人给我建议解决方案,这样我的承诺就得以实现,我的功能将从我第一次调用递归函数的地方继续。因此,超时将不会到来
我提供我的代码供参考
var mysql = require('mysql');
var con = mysql.createConnection({
"host": "somehost.com",
"user": "myusername",
"password": "mypassword",
"database": "mydatabase"
});
exports.handler = async (event, context) => {
try {
con.connect();
} catch (error) {
throw error;
return 0;
}
let tableId = '';
let count = '';
try {
var tempUsageData = {
user_id: userId,
code: code,
platform: source,
some_id: some_id,
count: count
};
dbColumns = 'user_id, code, platform, added_on, count, some_id';
let usageData = [
[userId, code, source, new Date(), count, some_id]
];
var tableInsert = await databaseInsert(con, constants.DB_CONSTANTS.DB_USAGE, dbColumns, usageData);
tableId = tableInsert.insertId;
} catch (error) {
console.log('@@ error insert table1 @@', error);
if (error.errno == 1062) {
try {
// calling recursive function here
let newTableData = await createTableEntry(con, tempUsageData);
tableId = newTableData.new_usage_id;
count = newTableData.new_count;
} catch (error) {
console.log('Error', error);
return 0;
}
} else {
return 0;
}
};
console.log('@@ EXECUTION DONE @@');
return 1;
}
var createTableEntry = (con, dataObject) => {
return new Promise(async function (resolve, reject) {
console.log('createTableEntry Called for count', dataObject.count);
try {
var newCounter = await getDataFromDatabase(con, dataObject.some_id);
dbColumns = 'user_id, code, platform, added_on, count, some_id';
let tableData = [
[userId, code, source, new Date(), Number(newCounter[0].counter + 1), some_id]
];
var tableInsert = await databaseInsert(con, 'table1', dbColumns, tableData);
let response = {
new_table_id: tableInsert.insertId,
new_count: Number(newCounter[0].counter + 1)
}
return resolve(response);
//function not returning from here once successful entry done and timeout occures
} catch (error) {
console.log('@@ ERROR @@', error);
if (error.errno == 1062) {
console.log('@@ CALL FUNCTION AGAIN @@');
dataObject.count = Number(newCounter[0].counter + 1);
await createTableEntry(con, dataObject);
} else {
return reject(error);
}
}
});
};
我的最终输出应该是消息“EXECUTION DONE”(执行完成),执行完成后应显示消息“EXECUTION DONE”(执行完成)
请给我建议解决这个问题的好办法。提前感谢。更新您的捕获块
catch (error) {
console.log('@@ ERROR @@', error);
if (error.errno == 1062) {
console.log('@@ CALL FUNCTION AGAIN @@');
dataObject.count = Number(newCounter[0].counter + 1);
let result = await createTableEntry(con, dataObject);
return resolve(result);
} else {
return reject(error);
}
}
更新你的捕获块
catch (error) {
console.log('@@ ERROR @@', error);
if (error.errno == 1062) {
console.log('@@ CALL FUNCTION AGAIN @@');
dataObject.count = Number(newCounter[0].counter + 1);
let result = await createTableEntry(con, dataObject);
return resolve(result);
} else {
return reject(error);
}
}
泄漏的全局
dbColumns
newCounter[0]。在newCounter[0]
可能被未定义的地方使用计数器将使您的程序面临恼人的类型错误!泄漏的全局dbColumns
newCounter[0]。在newCounter[0]
可能被未定义的地方使用计数器将使您的程序面临恼人的类型错误!