这是正在运行的代码,但不是我需要它的方式,不好解释它。
getRegisterFiles('regster1')
function getRegisterFiles(name) {
var request = $.ajax({
url: "/../files/Users/"+name+".ctp",
type: "GET",
dataType: "html"
});
request.fail(function(jqXHR, textStatus) {
$('#pageLoading p').html('We have experienced a problem. Please try again later.');
return false;
});
request.success(function(msg) {
placeData(msg);
});
}
function placeData(registerData) {
$('#pageWrap').html(registerData);
}
因此上面的代码会获得一个.ctp文件,然后将其显示在屏幕上。
我需要做什么
我没有在成功部分中使用placeData(msg),而是希望将'msg'的内容返回给将启动函数的变量,
register = getRegisterFiles('register1');
我尝试过使用,
return msg;
但是它不起作用......如果我使用return msg然后'alert'它会显示为未定义。
我不知道接下来要做什么,所以任何想法都会受到极大的欢迎。对不起,如果它是一个完整的新错误。
编辑--- 这是我试过的代码,我希望它能帮助你了解我正在尝试做什么。
var registerStep1 = null;
var registerStep2 = null;
function getRegisterFiles(name) {
var request = $.ajax({
url: "/../files/Users/"+name+".ctp",
type: "GET",
dataType: "html",
error: function(jqXHR, textStatus) {
$('#pageLoading p').html('We have experienced a problem. Please try again later.');
return false;
},
success: function(msg) {
return msg;
}
});
}
registerStep1 = getRegisterFiles('registerStep1');
registerStep2 = getRegisterFiles('registerStep2');
var tempInterval = setInterval(function() {
if(registerStep1 != null && registerStep1 != false) {
if(registerStep2 != null && registerStep2 != false) {
clearInterval(tempInterval);
placeData(registerStep1);
}
}
}, 100);
function placeData(registerData) {
var tempTimer = 0;
tempTimer = setInterval(function() {
if(controlTimeUp != false) {
$('#pageWrap').html(registerData);
methodToFixLayout();
$('#pageWrap').fadeIn("slow");
$('#pageLoading').css("display","none")
clearInterval(tempTimer);
}
}, 10)
}
答案 0 :(得分:2)
你正确地做到了。 AJAX调用无法向调用者返回值。这是因为AJAX是异步的。 (这是AJAX中第一个'A'代表的)。对getRegisterFiles('register1')
的调用立即返回。它不会阻止并等待来自服务器的响应。因此,它不能返回与服务器响应相关的任何值。
这是另一个与AJAX请求的异步性质有关的StackOverflow问题:Are AJAX calls not blocking and what is their lifespan?
已更新,可添加更多说明:
要观察这些示例,请安装Firefox的FireBug扩展程序或使用Chrome。分别打开FireBug或开发人员工具,然后观察控制台选项卡。
在这里,我接受了您的代码并添加了许多日志消息,以显示执行的顺序。
console.log('Defining function getRegisterFiles()');
function getRegisterFiles(name) {
console.log('enter: getRegisterFiles()');
var request = $.ajax({
url: "/../files/Users/"+name+".ctp",
type: "GET",
dataType: "html"
});
console.log("configuring failure handler");
request.fail(function(jqXHR, textStatus) {
console.log('enter: failure callback function');
$('#pageLoading p').html('We have experienced a problem. Please try again later.');
console.log('exiting: failure callback function');
return false;
});
console.log("configuring success handler");
request.success(function(msg) {
console.log('enter: success callback function');
placeData(msg);
console.log('exiting: success callback function');
return msg;
});
console.log('exiting: getRegisterFiles()');
return "This is the return value of getRegisterFiles()";
}
console.log("defining placeData() function');
function placeData(registerData) {
console.log('enter: placeData(); registerData="+registerData);
$('#pageWrap').html(registerData);
console.log('exiting: placeData()');
}
console.log("calling getRegisterFiles()');
var result = getRegisterFiles('regster1')
console.log("getRegisterFiles() finished; result="+result);
日志消息的顺序应该使执行顺序更加清晰。当您致电getRegisterFiles()
时,您需要配置一些参数并发起请求。然后该函数返回。您还没有来自服务器的任何响应,因此您无法对其进行操作。这在包含“getRegisterFiles()finished”的日志消息中可见。一段时间后,从服务器收到响应。此时,jQuery调用您注册为成功处理程序的函数。虽然从技术上讲你可以从函数中返回一个值,但是由于jQuery调用它,返回的值会返回到jQuery,只是忽略它。
以下是另一种变体,根据您的评论,使用分配:
var dataFromTheServer = "An initial value";
console.log('Defining function getRegisterFiles()');
function getRegisterFiles(name) {
console.log('enter: getRegisterFiles()');
var request = $.ajax({
url: "/../files/Users/"+name+".ctp",
type: "GET",
dataType: "html"
});
console.log("configuring failure handler");
request.fail(function(jqXHR, textStatus) {
console.log('enter: failure callback function');
$('#pageLoading p').html('We have experienced a problem. Please try again later.');
console.log('exiting: failure callback function');
return false;
});
console.log("configuring success handler");
request.success(function(msg) {
console.log('enter: success callback function');
dataFromTheServer = msg;
console.log('exiting: success callback function');
});
console.log('exiting: getRegisterFiles()');
return "This is the return value of getRegisterFiles()";
}
console.log("defining placeData() function');
function placeData(registerData) {
console.log('enter: placeData(); registerData="+registerData);
$('#pageWrap').html(registerData);
console.log('exiting: placeData()');
}
console.log("calling getRegisterFiles()');
getRegisterFiles('regster1')
console.log("getRegisterFiles() finished; dataFromTheServer="+dataFromTheServer);
placeData(dataFromTheServer);
这不能按预期工作的原因是因为在服务器响应请求之前调用了placeData()(long),因此尚未发生赋值。最终,当收到响应时,分配确实发生,但由于此时没有调用任何函数,所以没有对该值进行任何操作。
此外,我建议不要使用全局名称技术的赋值。使用局部变量更容易调试,更容易验证正确性,并且更容易重用代码,因为软件项目被修改以满足不断变化的需求而不是使用全局变量。
答案 1 :(得分:0)
你在哪里尝试回归?它必须在范围内:
request.success(function(msg) {
placeData(msg);
return msg;
});
应该有用,如果在那之外,它是未定义的。
其次,如果没有,我不知道你是否在使用另一个插件,但也许你应该像这样处理你的成功/失败?
function getRegisterFiles(name) {
var request = $.ajax({
url: "/../files/Users/"+name+".ctp",
type: "GET",
dataType: "html",
error: function(jqXHR, textStatus) {
$('#pageLoading p').html('We have experienced a problem. Please try again later.');
return false;
},
success: function(msg) {
return msg;
}
});
}
这就是这里定义的方式:http://api.jquery.com/jQuery.ajax/