我有那段代码:
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);
对这个问题出了什么问题?
答案 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"},
...