如何将websql .executeSql结果存储在全局变量中?

Sat*_*Raj 2 javascript callback web-sql cordova

如何获得结果

tx.executeSql('select query for a table',[],sucessCB);
function sucessCB(tx, results){  //<--- this results param
    console.log(results.row.item(0).name);
}
Run Code Online (Sandbox Code Playgroud)

我尝试了类似的东西

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
}
Run Code Online (Sandbox Code Playgroud)

如何在回调函数之外访问变量,或者是否有直接将sql结果存储在变量中的方法。有没有一种方法可以将变量再次发送到回调函数中

tx.executeSql('another select query',[],function(tx, results, tab ){  // <-- this inside sucessCB
console.log(tab);
});
Run Code Online (Sandbox Code Playgroud)

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

Kya*_*Tun 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); 
}
Run Code Online (Sandbox Code Playgroud)

但是,通过使用Deferred概念可以更好地解决此类问题。

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); 
}
Run Code Online (Sandbox Code Playgroud)