当下面的代码无中断运行时,最终的setOption()调用导致表被枚举,就好像执行了TRUNCATE TABLE一样。如果使用调试器(在我的例子中为“勇敢者”)逐步完成,则行为符合预期。我猜这是某种竞赛情况,但我不清楚如何解决。我尝试查看文档,但它们仍然很粗略。任何帮助表示赞赏。
<!DOCTYPE HTML>
<html>
<head>
<script src="https://cdn.jsdelivr.net/npm/alasql@0.4"></script>
<script>
"use strict"
function setOption(prop,value){
let sql = "SELECT count(id) as numrecs FROM dbOptions WHERE app = 'list_' AND property = '" + prop + "'";
let info = alasql(sql);
if(info[0].numrecs === 0) {
sql = "INSERT INTO `dbOptions` (`app`,`property`,`propertyValue`) VALUES('list_','" + prop + "','" + value+"')";
alasql(sql);
} else {
sql = "UPDATE `dbOptions` SET `propertyValue` = '" + value + "' WHERE `app` = 'list_' and `property` = '" + prop + "'";
alasql(sql);
}
alasql("COMMIT TRANSactION");
}
function getOptions() { //get all options
return alasql("SELECT `property`,`propertyValue` FROM `dbOptions`");
}
alasql("CREATE localStorage DATABASE IF NOT EXISTS listdb");
alasql("ATTACH localStorage DATABASE listdb");
alasql("USE listdb");
alasql("CREATE TABLE IF NOT EXISTS `dbOptions` (`id` int PRIMARY KEY,`app` char(255),`property` char(255),`propertyValue` char(255))");
alasql("TRUNCATE TABLE `dbOptions`");
console.log("INSERT: A = FIRST VALUE");
setOption("A","FIRST VALUE");
console.log(JSON.stringify(getOptions(),null,4))
console.log("INSERT: B = SECOND VALUE");
setOption("B","SECOND VALUE");
console.log(JSON.stringify(getOptions(),4))
console.log("REPLACE: 'A = REPLACEMENT VALUE");
setOption("A","REPLACEMENT VALUE");
console.log(JSON.stringify(getOptions(),4))
</script>
</head>
<body>
Hello
</body>
</html>