函数返回Ajax响应 - 值未定义? jQuery Ajax

时间:2012-05-29 08:23:58

标签: jquery ajax json

当我从jsonServerResponse函数提醒返回的值时,它的值是未定义的 - 尽管从process.php页面返回了JSON。

function jsonServerResponse(operation, JSOoptionalData) {
        JSOoptionalData = (typeof JSOoptionalData == "undefined") ? 'defaultValue' : JSOoptionalData
        var jqxhr = $.ajax({
            type: "POST",
            url: "process.php",
            data: "apicommand=" + JSOoptionalData,
            success: function (json) {
                return jQuery.parseJSON(json);
            }
        });
}

alert("Response as JS Object: "+jsonServerResponse("operation"));

我知道问题是异步请求完成之前发出的警报功能,但我不确定如何解决这个问题。任何建议都非常感谢:)

3 个答案:

答案 0 :(得分:5)

这是因为AJAX请求是异步的,因此在调用完成之前命中return,因此该函数始终返回null。

您需要在success回调本身内调用依赖于AJAX调用的代码。试试这个:

function jsonServerResponse(operation, JSOoptionalData) {
    JSOoptionalData = (typeof JSOoptionalData == "undefined") ? 'defaultValue' : JSOoptionalData
    var jqxhr = $.ajax({
        type: "POST",
        url: "process.php",
        data: "apicommand=" + JSOoptionalData,
        success: function (json) {
            alert("Response as JS Object: " + json);

            // to see more information about the object returned, use console.log:
            console.log(json);
        }
    });
}

jsonServerResponse("operation")

答案 1 :(得分:1)

你解决了这个问题,ajax是一个异步操作,你只能在成功回调中使用返回的数据:

function jsonServerResponse(operation, JSOoptionalData) {
    // What that line suppose to do???
        JSOoptionalData = (typeof JSOoptionalData == "undefined") ? 'defaultValue' : JSOoptionalData
        var jqxhr = $.ajax({
            type: "POST",
            url: "process.php",
            data: "apicommand=" + JSOoptionalData,
            dataType: "json", // Change the dataType to json.
            success: function (json) {
                console.log("Response as JS Object:") 
                console.log(json);
            }
        });
}

答案 2 :(得分:1)

好的,我从另一个帖子中找到了它。结果可以在成功回调中处理,也可以添加一个本身就是回调函数的参数,并将ajax请求的结果应用于回调。

function jsonServerResponse(operation, callback, JSOoptionalData) {
        JSOoptionalData = (typeof JSOoptionalData == "undefined") ? 'defaultValue' : JSOoptionalData
        jqxhr = $.ajax({
            type: "POST",
            contentType: "application/json",
            url: "process.php",
            data: "apicommand=" + operation + "&optionaldata" + JSON.stringify(JSOoptionalData),
            dataType: "json",
            success: function (json) {
                if(typeof callback === 'function') callback.apply(this, [json]);
            }
        });
}


jsonServerResponse("get_something_from_server", function(returnedJSO){
     console.log(returnedJSO.Result.Some_data);
}, "optional_data");

gdoron,你问的那条线使第三个参数成为可选的。我听说这是一个很好的做法,如果你要将一些数据传递到服务器上(但你不知道有多少变量)来添加一个可选参数并只传递一个js对象,将其转换为一个JSON字符串,然后将其解码为服务器 - 侧。

和平! :)