【问题标题】:Returning values from nested functions in Javascript [duplicate]从Javascript中的嵌套函数返回值[重复]
【发布时间】:2011-03-23 09:11:11
【问题描述】:

考虑这段代码(缩短)

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
            );
        }
    )
}

如何将 secret 的值返回给 main 函数?我已阅读此答案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;
}

但是这不起作用。

谢谢!

【问题讨论】:

    标签: javascript


    【解决方案1】:

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

    此外,您可以使用 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)
    })
    

    希望对您有所帮助。

    【讨论】:

      【解决方案2】:
      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会被更新。

      【讨论】:

      • 这行不通。查询的回调函数是异步执行的,而getSecret()的返回将在事务开始后立即发生。
      【解决方案3】:

      试试:

      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;
      }
      

      【讨论】:

      • 数据库操作不是异步的吗?我很确定确实如此,因此这里的解决方案不可能奏效。查询完成时调用“成功”回调函数,而外部函数会在查询开始后立即返回。
      • 这个“异步”问题得到解答了吗?
      • 我也有这个问题。如果是,你解决了这个问题,那么请分享谢谢。 - 尖尖和皮特肖
      猜你喜欢
      • 2015-08-01
      • 2015-03-15
      • 1970-01-01
      • 2015-07-20
      • 2014-09-01
      • 1970-01-01
      • 2011-03-31
      • 1970-01-01
      相关资源
      最近更新 更多