jQuery AJAX。返回值未定义?

时间:2011-10-25 09:31:26

标签: javascript jquery ajax

我有那段代码:

var s, d, p = '';

$.ajax(
    {
        type: "POST",
        url: ajaxurl,
        data: {action: "get_info"},
        success: function(r)
        {
            // r contain that json data
            // {"s":"long-string","d":"string","p":"string"}
            // That served from the server with that header
            //
            // header('Cache-Control: no-cache, must-revalidate'); 
            // header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
            // header('Content-type: application/json');

            d = r.d;
            s = r.s;
            p = r.p;
        }
    }
);

// And here console return s as undefined
console.log(s);

对这个问题出了什么问题?

4 个答案:

答案 0 :(得分:4)

$.ajax()调用只是启动ajax操作。然后代码落到你的console.log语句中,但是ajax调用还没有返回。因此,s的值尚未确定。

稍后,ajax调用会返回您的结果,此时您的回调将被触发。因此,如果要引用返回的值,则应在回调中引用变量s

更好的方法通常是这样的:

$.ajax(
    {
        type: "POST",
        url: ajaxurl,
        data: {action: "get_info"},
        success: function(r)
        {

            s = r.s;

            // Do something with s here...
        }
    }
);

如果你真的需要,你可以在回调之外引用s,但如果你这样做,你需要建立一些机制来确保s已经初始化(即你的ajax调用已经返回)。这引入了其他复杂性,例如同步和错误处理,并且可能使您的程序流程变得不可靠。

答案 1 :(得分:2)

原因是当你致电$.ajax(...);时,它会立即返回。 success属性指定在AJAX请求完成时调用的回调,并且s仅在那里填充;在此之前它是未定义的。

因此,在启动s回调之前,基本上不要对success执行任何操作。

答案 2 :(得分:1)

问题在于您认为代码的执行方式是按照您的布局方式执行的。它实际上与以下内容完全相同: -

var s, d, p = '';
// And here console return s as undefined
console.log(s);
$.ajax(
    {
        type: "POST",
        url: ajaxurl,
        data: {action: "get_info"},
        success: function(r)
        {
            // r contain that json data
            // {"s":"long-string","d":"string","p":"string"}
            // That served from the server with that header
            //
            // header('Cache-Control: no-cache, must-revalidate'); 
            // header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
            // header('Content-type: application/json');

            d = r.d;
            s = r.s;
            p = r.p;
        }
    }
);

你可能想要的是: -

var s, d, p = '';

$.ajax(
    {
        type: "POST",
        url: ajaxurl,
        data: {action: "get_info"},
        success: function(r)
        {
            // r contain that json data
            // {"s":"long-string","d":"string","p":"string"}
            // That served from the server with that header
            //
            // header('Cache-Control: no-cache, must-revalidate'); 
            // header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
            // header('Content-type: application/json');

            d = r.d;
            s = r.s;
            p = r.p;
            // And here console return s as undefined
           console.log(s);
        }
    }
);

答案 3 :(得分:1)

尝试指定数据类型            type: "POST", url: ajaxurl, dataType: 'json', data: {action: "get_info"}, ...