2013-02-15 110 views
0

试图运行一个脚本,(test.al();)和test.al内部,它的名为getcrypt.php(); php脚本在web服务器上,它工作中。目前,这些是我的脚本为什么这会返回我'undefined'

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在,它会告诉我“价值”,但不能使用它的变量外...

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

这会给我正确的值警报(仅次于“未定义”)

+0

也许这可能有所帮助:http://stackoverflow.com/questions/5403342/js-return-result-from-nested-ajax-success-function – vodka 2013-02-15 11:32:22

回答

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); 
+0

有趣的是,如果返回速度够快,最后警报将工作,因为你设置全球价值;) – EaterOfCode 2013-02-15 11:35:53

+0

我不认为一个PHP电话是那么快,所以可能永远不会发生。 – Asken 2013-02-15 11:36:46

+0

不,它不会,但为什么有'价值=价值',让我困惑了一下 – EaterOfCode 2013-02-15 11:37:28

0

$.ajax回报immidiately(当然,几乎:)),在接收到响应之前:

要获得价值了,你需要编写。你应该重写你的代码来适应这个事实,就像这样;

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

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提醒

0

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