- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我有一个 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/
我正在尝试使用当前日期和时间来执行 INSERT 和 SELECT 语句,但数据没有插入到 WebSQL 中。下面是我的代码: CREATION.. myDb.transaction(function
这是我在 stackoverflow 上的第一个问题。我尝试在这里和 Google 上搜索方法: 将文件转换为blob,将其保存在WebSQL中,然后从数据库中选择它并使用window.URL.cre
我正在使用以下语句在 Chrome 中创建一个 WebSQL 表: 'CREATE TABLE IF NOT EXISTS recs(id, fname,lname,email,country,com
所以我有一个 Javascript 类来包装和管理对 WebSQL 数据库系统的访问。 可以找到该类的代码:https://jsfiddle.net/dsct89kv/ 现在测试一下我正在使用的 fu
An online tutorial显示此交易: db.transaction(function (tx) { tx.executeSql('CREATE TABLE IF NOT EXISTS
我在循环方面遇到问题。我想实现以下步骤: 从网上下载一个巨大的 JSON 文件,然后我想循环遍历所有对象,并为每个对象(产品)从网上下载图像(使用 AJAX 调用)并填充 property obj.p
我正在尝试在 Phonegap 中创建一个应用程序并使用 WebSQL 创建本地数据库。我有一张名为“星星”的表...有很多 Actor /明星...在选择一颗星星的详细信息时,我想向其他相关明星(例
似乎无法弄清楚为什么这个简单的语句不起作用 tx.executeSql("INSERT INTO history SELECT * FROM scan"); 如果表历史记录为空,则它可以正常工作,这没
检查这个例子: var db = openDatabase( 'test.db', 1, '', 2*1024*1024 ); db.transaction(function(tx) { va
你好 friend ,我面临一个奇怪的问题。我开发 PHP 桌面应用程序, 我正在使用 websql 数据库。当我将数据提交到用户表中时 数据提交成功。但是当我提交到另一个表时数据却没有 提交的表结构
我正在尝试使用 WebSQL 和 JavaScript 执行登录功能。我写了一个函数,它接受一个参数(email)。该函数应该在数据库中搜索现有电子邮件,然后它应该返回一个警告,说明该电子邮件是否存在
我正在尝试使用复合主键在 websql 中创建一个数据库,但我似乎无法弄清楚此语句有什么问题: tx.executeSql('CREATE TABLE IF NOT EXISTS groepleden
我正在使用 WebSQL 和 IndexedDB 开发一个 Web 应用程序。 IndexedDB 在支持它的浏览器中运行良好,我的 WebSQL 实现在大多数浏览器中都可以运行,但是在 Androi
你好,我有一个工厂,它提供了与数据库一起使用的函数,它看起来像这样: .factory('DBwork', function () { var db = openDatabase("...");
这个问题已经有答案了: JavaScript closure inside loops – simple practical example (45 个回答) 已关闭 7 年前。 为什么我无法在事务中
我有以下代码来选择一行。当我用 getRecords("Peter Sam"); 调用函数时显示一条记录。但是,如果我只是通过 getRecords("Peter");它说“没有结果”。 getR
我在 iOS 上有一个使用 WebSQL 数据库的 PhoneGap 应用程序。在某些地方,我读到存储容量是 5MB,而在其他地方,我读到它是 50MB,有人可以帮我解决这个问题吗?我还计划在数据库中
https://www.w3.org/TR/webdatabase/#sqlstatementerrorcallback 看到这里sql语句错误回调定义了返回类型boolean: [Callback=
我正在使用 Web SQL 数据库构建应用程序。我记得在某处看到有一种方法可以使用 Google Chrome 来检查 Web SQL 数据库, 但是我找不到这样做的正确方法。 最佳答案 您可以使用
让我澄清一下,当我说移动网络应用程序时,我指的是旨在跨不同移动平台运行的网络应用程序,而不是访问互联网获取数据的 native 移动应用程序。 所以我正在阅读一些内容,看看这些移动网络应用程序如何在客
我是一名优秀的程序员,十分优秀!