2011-06-22 15 views
0

先週、私はjavascriptで遊んできたので、私の知識は非常に限られています。私と忍耐してください:-)

私はMySqlに日付とユーザーIDを格納する簡単な予約システムを書いています。指定された日がすでに予約されているかどうかをチェックします(yesの場合は、0を返すよりも空いている場合、UserIdを返すisTicket.phpを返します)。 日数の範囲を選択することが可能で、複数の警告を送信したくない場合は、選択した日に他のユーザーが既に予約されている場合、変数otherEventFoundをfalseに設定します。私は「アウトサイド」ポスト機能のこの変数を使用しようとしたと2つの可能性があります下に示すように

:私のスクリプトは、ライン>>アラートが含まれている場合

1)(「otherEventFoundが.. 。< <それが動作します。

2)私はこの行を削除した場合、それはしません。

私は少しdisorientatedだ。この追加の警戒ラインは、より一般的に非常に重要である、なぜ誰かが説明することができます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

'新しいブールは、()'それはちょうど、ブールリテラル 'true'にまたは' falseを割り当て、予期しない方法で動作します、悪い考えです'' var'宣言の中にあります。 ['Boolean'オブジェクト](https://developer.mozilla.org/ja/JavaScript/Reference/Global_Objects/Boolean)を使うと、条件文でそれを確実に使用することはできません。' if(new Boolean(false )){} 'は、オブジェクトがtrueに強制されるため、常にtrueに評価されます。 JavaScriptは厳密な型定義を使用しないので、格納する前にどのような変数値を宣言する必要はありません。 –

答えて

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" ... 
     } 
    } 
} 
+0

あなたの答えと説明をありがとう。しかし、この解決策はforループで生成される複数の警告の問題を解決しません。誰かがf.eを選択した場合。 5日間、3回はすでに予約されていますが、このコードは3回アラートを開始します。 "ありません..."と2回 "あなたはしたいですか?"この行動を克服する方法はありますか? –

+0

予約全体を 'setTicket.php'に移動しました。このスクリプトは、複数の日だけでなく、他のユーザーからの既存のチケットも処理します。決してあなたの助けに感謝しません。 –

関連する問題