-1

再生ボタンまたは停止ボタンのいずれかを表示するテーブルを作成しています。(および他のいくつかのもの)

for(var i = 0; i < result.length; i++){
var current = result[i].split("$");
if (CheckRunning(current[0])){
    t = t + "<tr><td><img alt='stop' id='img"+i+"' src='stop.png' onclick='ChangeButton(\"img"+i+"\");'/>";
} else {
    t = t + "<tr><td><img alt='play' id='img"+i+"' src='play.png' onclick='ChangeButton(\"img"+i+"\");'/>";
}}

ここでの問題は、CheckRunningメソッドです。非同期方式のデータベースを開きます。単純にtrue/falseを返すことはできません。それで、解決策は何ですか?とにかく、これがそのコードです:

  var tabel;
    var running = false;
    function CheckRunning(tabel){
    this.tabel = "tabel"+tabel+"";
    var db = window.openDatabase(this.tabel, "1.0", this.tabel, 1000000);
    db.transaction(checkrunningDB, checkerrorCB);
    console.log(this.running);
    return this.running;
    }

    function checkrunningDB(tx) {
       tx.executeSql('SELECT max(id), sluttime FROM '+this.tabel, [], checkrunningSuccess, checkerrorCB);
    }

    function checkrunningSuccess(tx, results) {
        if (results.rows.item(0).sluttime != null){
            this.running = false;
        } else{
            this.running = true;
        }
    }
    function checkerrorCB(err) {
         this.running = false;
        console.log(err);
    }
4

1 に答える 1

0

コールバック関数をに渡しますCheckRunning

CheckRunning(current[0], function(isRunning){...})
...
function CheckRunning(tabel, callback)
{
    var isRunning = null; // we don't know yet
    ....
    callback(isRunning);
}

tx.executeSqlこれは、checkRunningSuccessをコールバックとして受け取る関数に似ています。その場合、関数名はcheckRunningSuccessとしてハードコーディングされていますが、checkRunningでも同じことができます。


ちなみに、これがSQLクエリを実行するパブリックWebアプリである場合、SQLインジェクション攻撃に対して脆弱になります。

于 2012-12-03T19:17:39.730 に答える