异步调用返回一个值?

时间:2012-12-03 19:04:08

标签: javascript html html5

我正在建造一个显示播放按钮或停止按钮的表格。 (以及其他一些东西)

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);
    }

1 个答案:

答案 0 :(得分: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 injection attacks的攻击。<​​/ p>