簡體   English   中英

JavaScript WebSQL線程鎖定安全

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM