2016-05-15 54 views
0

相关问题(不工作):的WebSQL成功回调不能访问变量

scope-troubles-in-javascript-...

Pass extra parameters to WebSQL callback function?

我有一个“登录”对象捕捉到一些成功或错误变量作为的WebSQL事务循环遍历查询。循环中有一个循环,循环遍历从服务器以数组中对象的形式提供的数据输入,基本上是表格,然后是行。这一切都工作正常,直到sql-query的内部成功回调(不是最终的事务成功)被调用。正如你可以从下面看到的,我尝试调用函数构建器函数来捕获表名变量,但是当返回的函数被调用时它是未定义的。我尝试了很多方法,但是我最终只能使用未定义的或最后一个表的条目。

我试图简化我下面的代码,重点考虑的问题,有些代码可能是messy.I明白为什么它不提供因异步但不知道如何避开它。

addServData = function(data){ 
    var columns, colCount, rowCount, Q, Qmks, table, 
     rows, dataWatch = {success:{},error:{}}; 
    /*var tableName; //<-- MOVED THIS INTO LOOP AS THOUGHT WAS THE PROBLEM*/ 
    oDb.transaction(function(tx){ 
     for(var key in data){ 
      var tableName = key; 
      table = data[key]; 
      rows = table.data; 
      columns = table.columns; 
      colCount = table.colLen; 
      rowCount = table.rowLen; 
     if(rowCount <= 0) continue; 
      ... 
     Q = 'BUILD QUERY.... (?,?,?)'; 

     for(var x = rows.length-1; x >=0; x--){ 
      var $i = rows.length - (x+1);// <-- INVERT COUNTER 
      //sort row object to array in order of colums; 
      var row = rows[$i], 
       params = utils.sortObjtoArr(row, columns); 

      tx.executeSql(Q, params, 
       buildCallback(tblName), 
       function(tx,error){ 
        console.log('error: ', tx,error); 
        dataWatch.error[tblName + '::' + params[0]] = error; 
       }); 
     } 

     } 


function buildCallback(tbl){ 
       //console.log('buildcallback'+tblName, tx); //PRINTS CORRECT NAME; 
      return function(tx,success,tbl){ 
       console.log('success: ', tx, success, 'tblN:',tbl);//TBL = UNDEFINED; 
       dataWatch.success[tbl + '::' + success.insertId] = success.rowsAffected; 
       dataWatch.added += parseInt(success.rowsAffected); 
      } 
      } 
    }, function(tx,error){ 
     console.log(error, dataWatch); 

    }, 
    function(tx,success){ 
     console.log('success', dataWatch); //WORKS 

    }); 
} 

回答

0

对我来说这是一个标准疏忽,让自己感到困惑。

原来,在我的回调构建器中,我试图从sql-queries成功调用者函数中检索tbl变量,而不是从回调构建器的范围中获取! 回拨应该是:

function buildCallback(tbl){ 
      // return function(tx,success,tbl){ <-- NOT THIS; 
      return function(tx,success){ // <-- THIS; 
       console.log('success: ', tx, success, 'tblN:',tbl);//tbl = 'TABLE NAME'; 
       ..... 
      } 
      }