jQuery变量和$ .post

时间:2011-06-24 14:09:00

标签: jquery

我遇到了一些代码问题。我正在使用console.log()输出变量内容,但似乎$.post()需要很长时间,因此我的变量没有正确设置。这是我的代码。

$.tmsmm = { 
    duplicate_meeting : "something"
}; 
$.post("scripts/check_duplicate_meetings.php", { meeting_date: meeting_date, meeting_type: meeting_type }, function(data) {
    $.tmsmm.duplicate_meeting = data;
    console.log("myVar: " + $.tmsmm.duplicate_meeting);
});

console.log("myVar2: " + $.tmsmm.duplicate_meeting);

输出了什么:

  

myVar2:某事   myVar:这是ajax数据!

如您所见,myVar2在myVar之前被记录。我该如何解决这个问题?

更新:这个解决方案适合我的情况最好与使用$ .post成功或完成时调用函数的原因是我有很多代码在此示例之后依赖于变量值。我只记录了2次不同的值来解决为什么我的变量没有设置在$ .post函数之外的原因。谢谢大家的帮助!

8 个答案:

答案 0 :(得分:2)

$.tmsmm = { 
    duplicate_meeting : "something"
}; 
$.post("scripts/check_duplicate_meetings.php", { meeting_date: meeting_date, meeting_type: meeting_type }, function(data) {
    $.tmsmm.duplicate_meeting = data;
    console.log("myVar: " + $.tmsmm.duplicate_meeting);
    console.log("myVar2: " + $.tmsmm.duplicate_meeting);
});

将myVar2放在$ .post回调函数中,以便在myVar之后显示它。

答案 1 :(得分:1)

发布请求以异步方式发生。因此,在您发出post请求后,执行会立即跳转到底部的console.log。您需要在回调中处理任何响应。

答案 2 :(得分:1)

将myvar 2代码放在$ .post的成功函数中。这样,如果$ .post成功,您可以确保它只运行。

你可以在这里看到一个例子: http://api.jquery.com/jQuery.post/

答案 3 :(得分:1)

$.post是异步的。只要服务器返回某些内容,就会运行回调,而不是之前。 console.log紧跟在它之后,并且会在服务器返回响应之前同步运行。

您可以将console.log代码移至回调中,也可以使用$.ajax并将async选项设置为false。后一种选择是疯狂的,你基本上不应该这样做,因为浏览器将冻结(完全!),直到你的服务器响应。请参阅:http://api.jquery.com/jQuery.ajax

答案 4 :(得分:1)

尝试

var checkDuplicateMeetings = $.post("scripts/check_duplicate_meetings.php", { meeting_date: meeting_date, meeting_type: meeting_type }, function(data) {
    $.tmsmm.duplicate_meeting = data;
    console.log("myVar: " + $.tmsmm.duplicate_meeting);
});

checkDuplicateMeetings.complete(function(){
   console.log("myVar2: " + $.tmsmm.duplicate_meeting); 
});

对于上下文,我在此处使用complete事件进行演示。但是,您可以根据需要使用successerror个事件。收听complete事件将确保您的代码成为请求成功或出错后运行的最后一位。如果您想检查并运行特定代码是否成功,请相应地倾听successerror事件。

答案 5 :(得分:0)

您可以使用$ .ajax并使用async属性强制ajax调用同步。但是,这可能会导致浏览器挂起,应该避免使用。

http://api.jquery.com/jQuery.ajax/

但是,这首先打败了使用ajax的目的。你的榜样没有多大意义。为什么在返回之前需要检查duplicate_meeting

答案 6 :(得分:0)

您对console.log()的第二次调用将每次都完成。第一次调用将在成功完成ajax调用后发生,执行上下文将很快发生,第二次调用将首先发生。

答案 7 :(得分:-1)

尝试将check_duplicate_meetings.php更改为

<?php echo 'hi'; ?>

例如,

然后你可以看到你的PHP文件中是否有错误。如果php文件发生错误,变量'data'将不会被加载。

如果确实有错误,请尝试运行check_duplicate_meetings.php并在文件开头手动设置变量以进行测试。