Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript嵌套函数和变量_Javascript_Nested - Fatal编程技术网

javascript嵌套函数和变量

javascript嵌套函数和变量,javascript,nested,Javascript,Nested,上面的代码无效,所以我尝试了下面的代码 function GetMe(id) { DB.transaction( function (transaction) { transaction.executeSql("SELECT * FROM users WHERE id = ?", [id], function (transaction, results) { if(results.rows.length > 0) {

上面的代码无效,所以我尝试了下面的代码

function GetMe(id) {

DB.transaction(
    function (transaction) {

        transaction.executeSql("SELECT * FROM users WHERE id = ?", [id], function (transaction, results) {

            if(results.rows.length > 0) {

                var row = results.rows.item(0);

                return row.name;


            }

        }, errorHandler);
    }
);

}

alert(GetMe(1)); // id 5 exists in users table and alert shows empty
上面的代码应该可以很好地工作,但它没有我不知道它有什么问题,我几乎尝试了一切


有人能告诉我出了什么问题并帮我解决吗?谢谢:)

这看起来是因为
DB.transaction
异步的。您需要做的是将回调
函数
传递给您的
GetMe()
函数
,例如

function GetMe(id) {

var retval;

DB.transaction(
    function (transaction) {

        transaction.executeSql("SELECT * FROM users WHERE id = ?", [id], function (transaction, results) {

            if(results.rows.length > 0) {

                var row = results.rows.item(0);

                retval = row.name;
                //alert('IN ' + retval); //works

            }

        }, errorHandler);
    }
);

//alert('OUT ' + retval); // undefined

return retval;  // undefined

}

alert(GetMe(1));  // undefined
然后修改
GetMe
,如下所示:

GetMe(1, function (data) {

});

问题不在于嵌套函数,而是内部函数(传递到
transaction.executeSql
中的函数)在您认为它执行时没有执行。顺序更像以下内容:

  • GetMe跑步
  • 调用DB.transaction并传入回调
  • DB.1事务返回
  • GetMe返回(无)
  • 第一次回调将在稍后的某个未知点执行
  • 然后调用executeSql,并传入另一个回调
  • executeSQL返回
  • 回调返回(无)
  • 然后执行第二个回调(SQL运行后),并返回
    row.name
    ,但返回结果为nothing,程序的其余部分在log-ago之前继续运行
  • Tl;dr:您应该调用另一个声明的函数,而不是传入回调:

    function GetMe(id, callback) {
        DB.transaction(function (transaction) {
            transaction.executeSql("SELECT * FROM users WHERE id = ?", [id], function (transaction, results) {
                if(results.rows.length > 0) {
                    var row = results.rows.item(0);
                    callback.call(null, row.name);
                }
            }, errorHandler);
        });
    }
    

    从异步回调函数返回值是没有意义的。您误解了异步JavaScript编程的一个基本方面。@Pushpak我不相信这个问题的答案是正确的。
    function UpdateMe(){var data=GetMe();DB.transaction(//更多使用变量数据的事务和查询);}
    @beeglebug这就是我试图做的事情,从函数
    GetMe()
    中获取数据,然后在另一个函数中使用它进行其他更新这件事将在脚本中使用
    GetMe()
    大约20次,我不想重复,需要保持小而灵活。因此,我认为您的
    GotMe()
    不是一个解决方案,因为我会将数据用于各种目的,或者是否有方法从
    GotMe()
    获取数据,可能是我的所有其他函数。。
    // inside GetMe
    transaction.executeSql("SELECT * FROM users WHERE id = ?", [id], GotMe);
    
    // outside, in the same scope as GetMe
    function GotMe(transaction, results) {
        // do your stuff here
    }