【问题标题】:Why is this returning me 'undefined' [duplicate]为什么这会让我返回“未定义”[重复]
【发布时间】:2013-01-31 08:42:43
【问题描述】:

尝试运行脚本 (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;
            }
        });
    }
}

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

【问题讨论】:

标签: php javascript jquery ajax scope


【解决方案1】:

这是因为您正在进行异步调用。返回只针对success函数,不针对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);

【讨论】:

  • 有趣的是,如果返回速度足够快,最后一个警报将起作用,因为您将值设置为 global ;)
  • 我认为 php 调用没有那么快,所以可能永远不会发生。
  • 不,它不会,但为什么value = value让我有点困惑
  • 我的错...改了
  • 没关系;)每个人都会在某些时候犯错,我们只是喜欢称他们为错误
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    问题是 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 的提醒

    【讨论】:

      【解决方案4】:

      $.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事件驱动编程模型有用。

      【讨论】:

        猜你喜欢
        • 2016-09-24
        • 2013-06-21
        • 2018-03-08
        • 1970-01-01
        • 1970-01-01
        • 2011-05-07
        • 1970-01-01
        • 2021-10-19
        • 2018-07-11
        相关资源
        最近更新 更多