2010-07-30 138 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) 
}) 

希望有幫助。