【问题标题】:Return 'undefined' variable from a function从函数返回“未定义”变量
【发布时间】:2012-03-20 10:55:44
【问题描述】:

我是 javascript 新手,找不到解决方案。 我已经阅读了一些类似的问题,但看起来问题与我的不同。

我使用以下代码从 script1 调用一个方法:

 function turnPage(){
    var current = window.now;
    var nextpage = getNextPage(current);
    alert(nextpage);
}

在 script2 中有一个 SQLite 等:

function getNextPage(Pid) {
    db.transaction(function(tx) {
        tx.executeSql('SELECT * FROM Page WHERE Pid=' + Pid, [],
                    function(tx, results) {
            nextp = parseInt(results.rows.item(0).NextPage);
            //alert(nextp);
            return nextp;   
        }, errorCB);
    }, errorCBQuery);
}

如果我在被调用函数中使用警报对话框,则变量 nextp 为 2。 但是如果我返回变量,它会警告为“未定义”。 另外,如果我等使变量 var nextp = 11;通过 "db.transaction..." 和函数末尾的返回语句,它将返回 11 而不是 2。

是不是因为在我的函数开始时变量没有发送到内部函数? :)

有什么想法吗?谢谢!

【问题讨论】:

    标签: javascript html sqlite


    【解决方案1】:

    我不知道 javascript 中的 SQLite 是如何工作的,但我怀疑它是异步工​​作的,所以你在 turnPage 中调用 alert 但事务正在异步运行,并且返回值无论如何都在另一个范围内。您可以尝试将回调函数传递给getNextPage,然后使用nextp 作为参数调用回调而不是返回nextp

    function turnPage(){
        var current = window.now;
        getNextPage(current, function (nextp) { alert(nextp); /* do whatever else you need to do */ });
    }
    
    
    
    function getNextPage(Pid, cb) {
        db.transaction(function(tx) {
            tx.executeSql('SELECT * FROM Page WHERE Pid=' + Pid, [],
                        function(tx, results) {
                nextp = parseInt(results.rows.item(0).NextPage);
                cb(nextp);   
            }, errorCB);
        }, errorCBQuery);
    }
    

    【讨论】:

    • 谢谢,它成功了! (如果有人用这个代码,alert中有错别字,应该是alert(nextp),而不是alert(nextpage)
    • @user1255456 如果它解决了你的问题,记得接受答案。
    【解决方案2】:

    您的外部函数在任何时候都不会实际返回 nextp

    有两种解决方案(我认为)您将要做什么

    1. 创建一个全局变量并将nextp 的值存储在那里。
    2. 引入另一个回调以使用 nextp 的值,例如,创建一个新链接或其他什么。如果需要,您可以将代码放在另一个函数中并将其作为参数传递给getNextPage(),或者将代码直接放在最内部的函数中(在您的alertcall 的位置)。

    请注意,回调用于处理许多 JavaScript API 的异步特性。因此,当getNextPage() 完成时,即使您的getNextPage() 也无法返回内部查询的值,因为该值不存在。

    无论如何,可以删除最内部函数中的return 语句,因为没有函数可以实际接收该值。

    【讨论】:

      【解决方案3】:

      现在,您的代码存在几个问题。

      1. 由于 JavaScript 大多是异步的,你的代码:

        nextpage = getNextPage(current);
        alert(nextpage);
        

        会调用getNextPage(),但它不会在继续之前等待响应,因此警报将立即触发,并且在此时,如果尚未返回和分配响应(很可能是case), 那么nextpage 将是未定义的。

      2. 您的第二个问题是您的外部函数没有返回任何内容。您从内部函数返回值,但随后“卡在”外部函数中。一种解决方案是将值分配给全局变量,而不是从函数中返回它。您仍然需要注意“异步问题”,以便在分配全局变量之前不要读取它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-08
        • 2012-01-15
        相关资源
        最近更新 更多