gpt4 book ai didi

JavaScript WebSQL 线程锁定安全

转载 作者:行者123 更新时间:2023-12-03 07:23:51 26 4
gpt4 key购买 nike

所以我有一个 Javascript 类来包装和管理对 WebSQL 数据库系统的访问。

可以找到该类的代码:https://jsfiddle.net/dsct89kv/

现在测试一下我正在使用的

function(){
var test = new Database();
test.open("test");
test.query("CREATE TABLE `logs` (id INTEGER PRIMARY KEY, value VARCHAR)");
test.query("SELECT * FROM `logs`");
test.waitForBlockLift();
console.log(test.fetchRows());
}

如果我在控制台中逐行运行所有这些,它会完美运行,但如果我运行该组,它就会被线程锁定在 test.waitForBlockLift();

因此定义为

this.isBlocked = function(){ return blocking; };

this.waitForBlockLift = function(){
var test = this.isBlocked();
while(test){
test = this.isBlocked();
}
return true;
}

blocking 的初始值 = false,当调用 test.query 时,它被设置为 true,一旦事务完成并调用回调,则设置它回到 false 但由于某种原因,当我从控制台调用一行时,例如 test.query("SELECT * FROM logs");测试.waitForBlockLift(); console.log(test.fetchRows()); 这不会发生,JavaScript 引擎可以正常工作,因为我仍然可以使用控制台。但是,我无法访问测试,并且踏板似乎锁定了整个点,就是让它能够等待线程解锁。

我一定做错了什么,但无法弄清楚是什么

最佳答案

在Javascript的主线程中,这个构造:

this.isBlocked = function(){ return blocking; };

while(test){
test = this.isBlocked();
}

是一个无限循环。这是因为 Javascript 的主要执行路径是单线程的。因此,当您在该单线程中循环时,其他任何东西都无法运行。因此,阻塞变量永远无法更改,因此循环将永远运行。你不能在 Javascript 中执行这样的等待循环。

相反,您必须使用完成回调来了解异步操作何时完成。您不会显示任何实际的数据库代码,但所有数据库操作都应该有回调,告诉您它们何时完成。您将需要使用它们来了解操作何时完成。您传递一个回调,当事情完成时它会调用您。这样就可以在您等待调用回调函数时运行其他代码。

<小时/>

根据您的评论,在 Javascript 中,您不会这样做:

test.query("SELECT * FROM logs");
console.log(test.fetchRows());

相反,您可以使用完成回调来执行如下操作:

test.query("SELECT * FROM logs", function(result) {
console.log(test.fetchRows());
});

或者,如果您从 test.query() 返回了一个 Promise,您可以像这样编码:

test.query("SELECT * FROM logs").then(function(result) {
console.log(test.fetchRows());
});

关于JavaScript WebSQL 线程锁定安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36088356/

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