上周我开始玩javascripts所以我的知识非常有限。请耐心等待我: - )
我正在编写一个简单的预订系统,在MySql中存储日期和用户ID。它检查给定日期是否已经被预订(如果是,则isTicket.php返回UserId,如果它仍然是免费的,则返回0)。 因为可以选择一个天的范围而我不想发送多个警告我将变量otherEventFound设置为false,如果在任何选定日期已经预订了其他用户。
如下图所示,我试图使用后变量的“外侧”变量,有两种可能性:
1)如果我的脚本包含>>行alert(“otherEventFound ...<< it works。
2)如果我删除此行,则不会。
我有点迷失方向。有人可以解释为什么这个额外的警报线是如此重要,更普遍的是可以从post.success函数覆盖父函数中的变量吗?
如果它纯粹运气而不是使用警报线,那么在javascript中使用它的正确方法是什么?
parent function
...
var otherEventFound = new Boolean();
var do_the_booking = new Boolean();
otherEventFound = false;
do_the_booking = false;
for ( var i = myStart.getDfJ(); i <= myEnd.getDfJ(); i++)
{
// conver i to MySQL format yyyy-mm-dd
var milliseconds = 1000 * 60 * 60 * 24 *i;
var j = new Date(milliseconds);
var strID = j.toYMD();
// and ask server if there is other event on this day
$.post("isTicket.php", { theDay: strID },
function(answ){
if ( parseInt(answ) == 0 ){
do_the_booking = true;
}
else {
if ( !(parseInt(answ) == currentUserId) ){
otherEventFound = true;
}
}
}
);
}
alert ("otherEventFound " + otherEventFound + " do_the_booking " + do_the_booking);
if (otherEventFound==true) {
alert ("There is not yours event booked on this day.");
do_the_booking=false;
};
if (do_the_booking==true){
var x=window.confirm("Do you want to book on this/these day/s?")
if (x) {
// ... do something like $.post("setTicket.php" ...
}
}
答案 0 :(得分:3)
当你执行$ .post时,会启动一个异步的AJAX请求,稍后会回调你的内联函数。由于在返回固定数量的异步请求之前,您不希望执行某段代码,因此您必须跟踪已完成的请求数。
它与警报“一起工作”的唯一原因是因为警报会插入一个暂停,直到您回答AJAX调用完成的那一点为止 并执行内联函数。
你基本上想要修改你的代码:
var otherEventFound = false;
var do_the_booking = false;
var completeRequests = 0;
for ( var i = myStart.getDfJ(); i <= myEnd.getDfJ(); i++)
{
// do something
// and ask server if there is other event on this day
$.post("isTicket.php", { theDay: strID },
function(answ){
completeRequests++;
if ( parseInt(answ) == 0 ){
do_the_booking = true;
}
else {
if ( !(parseInt(answ) == currentUserId) ){
otherEventFound = true;
}
}
if (completeRequests == myEnd.getDfJ()) {
postProcessing();
}
}
);
}
function postProcessing() {
alert ("otherEventFound " + otherEventFound + " do_the_booking " + do_the_booking);
if (otherEventFound==true) {
alert ("There is not yours event booked on this day.");
do_the_booking=false;
};
if (do_the_booking==true){
var x=window.confirm("Do you want to book on this/these day/s?")
if (x) {
// ... do something like $.post("setTicket.php" ...
}
}
}