有人可以解释一下吗?
function naviSet() { var pageCount; if($.ajax({ type: "POST", url: "http://localhost/mywebsite/wp-content/themes/twentyeleven/more-projects.php", success:function(data) { pageCount = data; alert(pageCount); //alert 1 return true; }, error:function() { $("#direction").html("Unable to load projects").show(); return false; } })) alert(pageCount); //alert 2 }
答案 0 :(得分:2)
alert1在回调中 - 只有在ajax请求成功完成(即异步)时才会调用此函数。
由于同样的原因,pageCount是不同的 - 调用alert2时尚未成功回调。
答案 1 :(得分:2)
由于大多数答案都提到你进行异步调用,但事实并非如此。所以JavaScript是单线程的,每次只能思考。
首先你调用你的函数,这个函数将放在执行上下文堆栈上。在将要添加到堆栈的任何其他函数执行之前,将执行此函数。在此函数中,您可以进行ajax调用,并且在成功时,成功函数将被放在执行上下文堆栈中。所以这个函数永远不会在naviSet
之前调用过。当alert1在naviSet
函数中生成时,它将首先被调用。
关于你的第二个问题:
从您的功能我认为您相信,当$.ajax()
返回true
时,您的ajax调用成功并且pageCount
已设置为数据。但事实并非如此。 $.ajax
不会返回true,而是返回真值$
。它是一个返回对主jquery对象的引用的函数,因此您可以链接函数调用。
函数naviSet()
{
//you create a new var which is undefined
var pageCount;
// return $ which is a truethy in JavaScript, but it does not mean the ajax call was successful
if($.ajax({
type: "POST",
url: "http://localhost/mywebsite/wp-content/themes/twentyeleven/more-projects.php",
success:function(data)
{
// now you in the context of your success function
// and set the value of your variable to data
pageCount = data;
alert(pageCount); //alert 1
return true;
},
error:function()
{
$("#direction").html("Unable to load projects").show();
return false;
}
}))
//here you are still in the context of your naviSet function where pageCount is undefined
alert(pageCount); //alert 2
}
答案 2 :(得分:1)
为什么在警报1之前警告2次弹出?
警报1由收到成功HTTP响应时触发的回调函数触发。
警报2在发送HTTP请求后立即触发。
网络很慢。
为什么警报1中的pageCount值与警报2不同?
因为它在收到响应时(就在它被提醒之前)被更改,所以通过与上述相同的回调函数。
答案 3 :(得分:1)
ajax-function从给定的URL 异步中检索数据。这意味着它在后台执行,而其余代码执行。一旦完成,就会调用分配给“成功”的功能(或“错误”,如果失败)。
因此,首先调用第二个警报。就像我说的那样,其余代码在ajax-function工作时继续执行。
答案 4 :(得分:1)
第一个警报首先发生的原因是因为ajax
调用是异步的。它基本上安排了一个Web调用并立即返回。因此,它之后的第二个警报就是直接发生的。
稍后,Web请求将在某个时间点完成并调用success
函数。因此,第一个警报发生在那一点