2010-07-30 110 views
5

考虑这个代码(缩短)返回从嵌套函数值在Javascript

function getSecret() { 
    db.transaction(
     function (transaction) { 
      transaction.executeSql(
       'SELECT * FROM table LIMIT 1;', 
       null, 
       function(transaction, result) { 
        var row = result.rows.item(0); 
        var secret = row.secret; 
        return secret; 
       }, errorHandler 
      ); 
     } 
    ) 
} 

我怎么会秘密的值返回到主功能?我看了这个答案Return value from nested function in Javascript

并试用了此

function getSecret() { 
    db.transaction(
     function doSql(transaction) { 
      transaction.executeSql(
       'SELECT * FROM table LIMIT 1;', 
       null, 
       function(transaction, result) { 
        var row = result.rows.item(0); 
        var secret = row.secret; 
        return secret; 
       }, errorHandler 
      ); 
     } 
    ) 
    return doSql; 
} 

然而,这没有奏效。

谢谢!

回答

4

尝试:

function getSecret() { 
    var secret = ''; 

    db.transaction(
     function (transaction) { 
      transaction.executeSql(
       'SELECT * FROM table LIMIT 1;', 
       null, 
       function(transaction, result) { 
        var row = result.rows.item(0); 
        secret = row.secret; 
       }, errorHandler 
      ); 
     } 
    ) 

    return secret; 
} 
+12

数据库操作是否不同步?我很确定它是这样的,因此这里的解决方案不可能奏效。查询完成时调用“成功”回调函数,而在查询*开始后立即返回外部函数*。 – Pointy 2012-01-24 14:00:52

+0

当它是异步时如何使这项工作? – Madhusudhan 2012-05-18 04:51:50

+0

这是否有'异步'的问题得到答案? – Black 2013-04-03 11:36:08

1
function getSecret() { 
    var retval = undefined; // or a reasonable default 
    db.transaction(
     function doSql(transaction) { 
      transaction.executeSql(
       'SELECT * FROM table LIMIT 1;', 
       null, 
       function(transaction, result) { 
        var row = result.rows.item(0); 
        var secret = row.secret; 
        retval = secret; 
       }, errorHandler 
      ); 
     } 
    ) 
    return retval; 
} 

这将创建在retval变量封闭。当调用transaction时,retval将被更新。

+6

这将无法正常工作。查询的回调函数是异步执行的,而getSecret()的返回将在事务启动后立即发生*。 – Pointy 2012-01-24 13:59:38

0

在返回有效负载之前尝试promisifying数据库操作。

此外,您可以使用promise中内置的reject()作为错误处理程序,只要函数返回undefined就返回事务对象。函数内

申报承诺:

function getSecret() { 
    var secret = ''; 
    return new Promise(function(resolve, reject) { 
     db.transaction(
      function(transaction) { 
       transaction.executeSql(
        'SELECT * FROM table LIMIT 1;', 
        null, 
        function(transaction, result) { 
         if (typeof(result) === 'undefined') { 
          var row = result.rows.item(0); 
          secret = row.secret; 
          resolve(secret) 
         }, 
         else { 
          reject(transaction) 
         } 
        } 
       ); 
      } 
     ) 
    }) 
} 

然后调用该函数。

//If function resolves, log the secret. 
//if function rejects, log the transaction 
getSecret().then(function(secret) { 
    console.log(secret); 
}) 
.catch(function(err) { 
    console.log('Error in db.transaction ' + err) 
}) 

希望有帮助。