如何存储websql .executeSql导致全局变量?

时间:2013-01-29 11:31:30

标签: javascript cordova callback web-sql

如何访问

的结果
tx.executeSql('select query for a table',[],sucessCB);
function sucessCB(tx, results){  //<--- this results param
    console.log(results.row.item(0).name);
}

我试过像

这样的东西
function(){
    var tab = [];
    tx.executeSql('select query for a table',[],sucessCB);

    function sucessCB(tx, results){  //<--- this results param
        console.log(results.row.item(0).name);
        for(i=0;i<results.length;i++){
            tab.push(results.row.item(i))
        }
    }

    console.log(tab);  //<--- this returns always null
}

如何访问回调函数之外的变量,或者是否有办法直接将sql结果存储在变量中。有没有办法在

中再次将变量发送到回调函数
tx.executeSql('another select query',[],function(tx, results, tab ){  // <-- this inside sucessCB
console.log(tab);
});

在所有情况下,变量都为null。还有另一种方法可以做到这一点。任何建议都会有所帮助,谢谢。

1 个答案:

答案 0 :(得分:5)

您使用回调如下:

var querySql = function(sql, callback) {

  tx.executeSql(sql,[],sucessCB);

  function sucessCB(tx, results){  //<--- this results param
    var tab = [];
    for(i=0;i<results.length;i++){
        tab.push(results.row.item(i))
    }
    callback(tab);
  }
}

querySql('select query for a table', function(result) {
   console.log(result); 
}

然而,使用Deferred concept可以更好地解决这类问题。

var querySql = function(sql) {
  var df = $.Deferred();
  tx.executeSql(sql,[],sucessCB, errCB);

  function sucessCB(tx, results){  //<--- this results param
    var tab = [];
    for(i=0;i<results.length;i++){
        tab.push(results.row.item(i))
    }
    df.resolve(tab);
  }
  function errCB(tx, e) {
    df.reject(e);
  }
}

querySql('select query for a table').done(function(result) {
   console.log(result); 
}