从Javascript中的嵌套函数返回值[重复]

Posted

技术标签:

【中文标题】从Javascript中的嵌套函数返回值[重复]【英文标题】:Returning values from nested functions in Javascript [duplicate] 【发布时间】: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;

但是这不起作用。

谢谢!

【问题讨论】:

【参考方案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;

【讨论】:

数据库操作不是异步的吗?我很确定确实如此,因此这里的解决方案不可能奏效。查询完成时调用“成功”回调函数,而外部函数会在查询开始后立即返回。 这个“异步”问题得到解答了吗? 我也有这个问题。如果是,你解决了这个问题,那么请分享谢谢。 - 尖尖和皮特肖

以上是关于从Javascript中的嵌套函数返回值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何从javascript中的函数返回值[重复]

javascript - 如果在子对象中找到值,则搜索嵌套对象数组并返回父对象[重复]

无法从从 sql 数据库读取的 javascript 函数中获取返回数组 [重复]

函数——基本语法,嵌套匿名高阶递归函数

从JavaScript中的多个函数返回结果[重复]

C语言-函数