[英]JavaScript WebSQL Thread Locking Safety
因此,我有一個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;
}
當查詢被稱為test.query
時, blocking
的初始值= false設置為true,一旦事務完成並調用了回調,然后將其設置回false,但是由於某種原因,當我從控制台中單行調用時例如test.query("SELECT * FROM logs"); test.waitForBlockLift(); console.log(test.fetchRows());
test.query("SELECT * FROM logs"); test.waitForBlockLift(); console.log(test.fetchRows());
javascript引擎無法正常運行,因為我仍然可以使用控制台。 但是,我無法訪問測試,胎面似乎鎖定了整個點,是為了使其能夠等待線程解鎖。
我一定在做錯事,但無法解決
在Javascript主線程中,此構造:
this.isBlocked = function(){ return blocking; };
while(test){
test = this.isBlocked();
}
是一個無限循環。 這是因為Javascript中的主要執行路徑是單線程。 因此,當您在那個單線程中循環時,其他任何事情都無法運行。 因此, blocking
變量永遠無法更改,因此循環將永遠運行。 您無法在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());
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.