从函数返回文本

时间:2012-07-31 19:32:03

标签: jquery

这是正在运行的代码,但不是我需要它的方式,不好解释它。

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

2 个答案:

答案 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/