【问题标题】:Javascript function is not returning a value in AngularAppJavascript函数未在Angular App中返回值
【发布时间】:2015-07-30 16:52:21
【问题描述】:

首先,抱歉我的英语不好。 好吧,这种情况下的问题是一个函数:'refresh',查询正在响应并从 mysql 中的数据库返回值,但是当我尝试获取响应并返回另一个函数时,向我显示“未定义”值..这是代码:

function refresh(query){
    var res;
    $http.get('/quaestioJS/'+query).
    success(function(data, status, headers, config) {
        console.log(data);  //HERE, THE INFO IS SHOWING CORRECTLY
        res = data;         //HERE 'res' IS NOT GRABBING THE VALUE OF 'data'
    }).
    error(function(data, status, headers, config) {
        console.log("Error.");
        console.log(data);
    });
    console.log(res);
    return res;
}

更新 V1.0

更新后的代码:

function refresh(query){
    $http.get('/quaestioJS/'+query).
    success(function(data, status, headers, config) {
        return data;
    }).
    error(function(data, status, headers, config) {
        console.log("Error.");
        console.log(data);
    });
}

这里显示了代码中的变量和函数...响应是一样的:未定义

function find(tabla){
    var x = refresh("SELECT * FROM "+tabla);
    console.log(x);
    $scope.limpiar();
}

【问题讨论】:

    标签: javascript mysql angularjs node.js express


    【解决方案1】:

    这就是callbacks 的概念出现的时候。为了获取响应,您必须传递一个函数/回调/响应处理程序,该处理程序将为您提供操作响应的控件。

    您在当前实现中未定义的原因是因为您调用的函数的执行在 HTTP 调用的响应出现之前完成。这样的话,返回的值将是未定义的。

    因此,您可以通过传递响应处理程序来获取响应,如下所示:

        function find(tabla){
            refresh("SELECT * FROM "+tabla, function(data, status, headers, config) {
                console.log(data);
                $scope.limpiar();
            });
        }
    
    
        function refresh(query, handler) {
            $http.get('/quaestioJS/'+query).
            success(handler).
            error(function(data, status, headers, config) {
                console.log("Error.");
                console.log(data);
            });
        }
    

    【讨论】:

    • 很好,但同样的事情,如果我尝试从处理程序中获取响应并返回数据,总是'未定义'......我认为我将使用 $scope 变量来查看数据..
    • 您不应该从处理程序返回数据。您应该从处理程序执行所有操作,或者从处理程序调用一些执行此操作的函数。这就是我在响应处理程序中移动 $scope.limpiar() 的原因
    【解决方案2】:

    $http.get 的原因是异步工作。所以你正确设置了 res 变量,但是当你在控制台记录 res 时,它发生在数据返回之前。所以正确的修改是:

    function refresh(query, callback){
        var res;
        $http.get('/quaestioJS/'+query).
        success(function(data, status, headers, config) {
            console.log(data); 
            res = data;
            callback(res);
        }).
        error(function(data, status, headers, config) {
            console.log("Error.");
            console.log(data);
        });
    
    }
    
    function find(tabla){
        var x = refresh("SELECT * FROM "+tabla, function(data){
            console.log(data); 
            $scope.limpiar();
        });
    
    }
    

    编辑:对不起,我的第一次尝试是一个错误,完全忘记了 return 只会从成功函数中返回。

    【讨论】:

    • 是的,但真正的问题是函数没有返回“数据”或“资源”,主要响应在那里,但返回“不工作”,我的控制台显示“未定义” ..在初始代码中,返回在函数的末尾,因为在其他帖子中说您不能将返回放入可调用对象中,但您可以从可调用对象中获取值并在函数末尾返回D:
    • 因为返回是退出回调函数而不是外部函数...可以这么说。检查此 SO,将更新我的:stackoverflow.com/questions/20772502/…
    猜你喜欢
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    • 2016-03-25
    • 2012-03-12
    相关资源
    最近更新 更多