0

尝试运行脚本 (test.al();) 并在 test.al 内部调用 getcrypt.php();,该 php 脚本位于网络服务器上,并且正在运行。目前,这些是我的脚本

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;
            }
        });
    }
}

这会给我一个正确值的警报(在“未定义”之后)

4

4 回答 4

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);
于 2013-02-15T11:29:47.270 回答
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 的警报

于 2013-02-15T11:31:33.790 回答
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我认为本教程可能对您学习 javascript 事件驱动编程模型有用。

于 2013-02-15T11:30:02.177 回答
0

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

于 2013-02-15T11:32:19.583 回答