从Javascript中的嵌套函数返回值

时间:2010-07-30 17:26:42

标签: 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
            );
        }
    )
}

如何将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;
}

然而这不起作用。

谢谢!

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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将会更新。

答案 2 :(得分:0)

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

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

在函数中声明promise:

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

希望有所帮助。