尝试运行一个脚本(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'之后)
答案 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。我不确定是否可以使用成功回调的返回值进行任何操作,您需要在成功回调本身中使用您的逻辑(或使用逻辑调用另一个函数),就像您使用在最后的例子中提醒