$ .post函数可以覆盖父函数中的变量

时间:2011-06-22 01:19:37

标签: javascript jquery post

上周我开始玩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" ...
       }
    }

1 个答案:

答案 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" ...
       }
    }
}