为什么这会让我'未定义'

时间:2013-02-15 11:22:30

标签: php javascript jquery ajax scope

尝试运行一个脚本(test.al();)并在test.al中调用它的getcrypt.php();, php脚本在web服务器上,它正在运行。目前,这些是我的脚本

JS

var getcrypt = {
    php: function () {

        $.ajax({
            url: "server.com/return.php",
            type: "POST",
            async: true,
            data: "id=getit",
            success: function (msg) {
                var v = msg.match(/^.*$/m)[0];
                return v;
            }
        });
    }
}

var test = {
    al: function () {
        a = getcrypt.php();
        alert(a);
    }
}

PHP

<?php
    $id = $_POST['id'];
    if ('getit' == $id){
        $value = 'VALUE';
        echo $value;
    }else{
        echo 0;
    }
?>

通过这种方式,它将显示带有'unidefined'的警报,如果我添加警报(v);在返回v之前,它会显示'VALUE',但不能在变量之外使用它......

var getcrypt = {
    php: function () {

        $.ajax({
            url: "server.com/return.php",
            type: "POST",
            async: true,
            data: "id=getit",
            success: function (msg) {
                var v = msg.match(/^.*$/m)[0];
                alert(v);
                return v;
            }
        });
    }
}

这会给我一个正确值的警报(在'undefined'之后)

4 个答案:

答案 0 :(得分:4)

这是因为您正在进行异步调用。返回仅适用于成功函数,而不适用于php函数。

要获得价值,您需要写:

var value;

var getcrypt = {
  php: function (callback) {

    $.ajax({
        url: "",
        type: "POST",
        async: true,
        data: "id=getit",
        success: function (msg) {
            var v = msg.match(/^.*$/m)[0];
            alert(v);
            callback(v);
        }
    });
  }
}

getcrypt.php(function(v) {
  alert(v);
  // This happens later than the below
  value = v;
});

// The below will still not work since execution has already passed this place
// alert will still return undefined
alert(value);

答案 1 :(得分:1)

问题是jQuery ajax与回调一起使用并且不能与返回值一起使用,所以你需要为你的getcrypt函数添加一个回调所以说

var getcrypt = {
php: function (callback) {

    $.ajax({
        url: "server.com/return.php",
        type: "POST",
        async: true,
        data: "id=getit",
            success: function (msg) {
                var v = msg.match(/^.*$/m)[0];
                callback(v);
            }
        });
    }
}

现在如果你打电话

getcrypt.php(function(returnVar){
   alert(returnVar)
});

您将收到VALUE的提醒

答案 2 :(得分:0)

在收到回复之前,

$.ajax在调用时立即返回(好吧,差不多:))。你应该重写你的代码以适应这个事实,就像这样;

var getcrypt = {
    php: function(){
        $.ajax({
           //..other params ..//
           success: function(msg){
               var v = msg.match(/^.*$/m)[0];
               alertResponse(v);
           }
        });
    },
    alertResponse: function(processedResponse) {
         alert(v);
    }
}

var test = {
al: function(){
        getcrypt.php();
    }
}

如果您需要在test对象中进行回复,请将alertResponse移至该对象,然后从success方法调用该对象。我认为this tutorial可能对您学习javascript事件驱动的编程模型很有用。

答案 3 :(得分:0)

$ .ajax调用是异步的。所以你得到的是$ .ajax的返回值(在收到响应之前发送请求时)。只有当浏览器收到对ajax调用的响应时,才会运行成功回调,作为$ .ajax调用的seerate进程。换句话说,$ .ajax的返回值将始终为null。我不确定是否可以使用成功回调的返回值进行任何操作,您需要在成功回调本身中使用您的逻辑(或使用逻辑调用另一个函数),就像您使用在最后的例子中提醒