2011-07-02 4 views
-1

JSとjQueryには本当に奇妙な問題があります。私はブレークポイントを追加するときjavascriptはブレークポイントでのみ実行されます

$('#skip').click(function(e) { 
    savePhoto('skip'); 
    showNextPlace(); 
    photo_changed = 0; 
    return false; 
}); 

showNextPlace()photo_changed = 0;にのみ実行されます。 savePhoto();のコードは非常に基本的です。私は、places配列の要素の数とステータスに応じてリクエストを送信します。

function savePhoto(status) 
    { 
     if (places.length <= 5) 
     { 
      // load more places 
      $('#loadmore').val('1'); 
     } 

     // Don't send a request on skip unless we need more places 
     if (status != 'skip' || $('#loadmore').val() == 1) 
     { 
      $.ajax({ 
       url: "url" + status, 
       cache: false, 
       data: $('#form_photo').serialize(), 
       success: function(results){ 
        // dont load more places until we have few 
        $('#loadmore').val('0'); 

        if (results != '[]') 
        { 
         for (var i in results) 
         { 
          places.push(results[i]); 
         } 
        } 
       } 
      }); 
     } 
    } 

なぜこのようなことが起こるか、どうすれば問題をよりよくデバッグできますか?ブレークポイントがある間

+0

'success'コールバックでコードをコメントアウトすると動作しますか?何かエラーがありますか?いくつかのロギングを関数呼び出しに追加して、実際に何が実行されているかを確認します。たとえば、 'console.log( 'showNextPlace')'から 'showNextPlace'関数です。 – Heikki

答えて

-1

問題はAJAX呼び出しに関連していませんでした。コードの別の部分では、ユーザーが保存ボタンを押すたびにイメージフィールドにイベントをバインドしていました(2回目のコード実行で2回目、3回目など)。バインドを解除することを忘れないでください!

また、skipをクリックしても、クロージャ& saveプラグインが実行されていたので、いくつかのコントロール変数を追加しました。

解決方法:ロジックが実行できるすべてのパス上のconsole.log()。

+0

コードの別の部分 - 私たちを見せなかったのですか? –

+0

私はそれが関連していないと思った!うれしい私はそれを見つけた:) – fesja

2

非同期XHRコール

$.ajax({ ... }) 

はおそらく到着されていますが、ブレークポイントで実行されないとき、そのコードに達したときに、XHRリクエストは、飛行中のままです。

多分、場所がロードされた後の次の場所を示す$ .ajax呼び出しのコールバックが必要です。

ブールneedsToShowNextPlaceが真である、と示すために何の次の場所がない場合、それが呼び出された場合はブールshowNextPlaceセットを持っている場合は、$アヤックスのハンドラ呼び出しshowNextPlaceを持つことができます。

+0

ありがとうございますが、AJAXリクエストは常に実行されているわけではありません(status = skip、loadmore = 0の場合は表示されません)、成功コードはshowNextPlace()関数を変更しません。 – fesja

+0

@fesjaでは、 'showNextPlace'は成功コードによって変更された' places'配列を使用すると仮定しました。そうじゃないの? –

+0

はい、いいえ。 'places'配列には、待ち行列があります。 AJAXリクエストを呼び出すと、配列に5つの要素があります。受け取った場所をキューに追加します。しかし、この問題はこのAJAXリクエストとは関係ありませんでした。下の私の答えを見てください。とにかくありがとう! – fesja

1

$.ajax呼び出しは非同期であるため、あなたはこのようなsuccessハンドラにコードを置く必要があります。

success: function(results){ 
    // dont load more places until we have few 
    $('#loadmore').val('0'); 
    if (results != '[]') 
    { 
     for (var i in results) 
     { 
      places.push(results[i]); 
     } 
    } 
    showNextPlace(); //Moved here 
    photo_changed = 0; //Moved here 
} 

だからあなたのクリックのバインドは次のようになります。

$('#skip').click(function(e) { 
    savePhoto('skip'); 
    return false; 
}); 

それがために働いていませんでした、元のコードでshowNextPlace()photo_changed=0が実行されてからsavePhoto('skip')が実行を終了しました。 (それは非同期です)。これは、完了までに十分な時間がsavePhoto()となったため、ブレークポイントで動作しました。

これが役に立ちます。歓声

+0

'savePhoto'がコールバックを受け入れるようにするのも良いでしょう。 –

+0

あなたはそうです。しかし、私は彼にアイデアを得させたいと思って、それをリファクタリングすることができます。 –

+0

ありがとうございますが、それは私がそれがうまくいくとは期待していません。現在の写真を保存して次の写真を表示することは、2つの異なる無関係な出来事です。私はAJAXリクエストを送信しますが、showNextPlace()関数を変更した結果は何もしません。私はただインターフェイスを高速にしたいので、写真をバックグラウンドで保存し、すぐに次のものをロードします。さらに、AJAXリクエストは常に実行されるわけではありません(status = skipおよびloadmore = 0の場合、私はあなたが見ることができるように呼び出しません)。 – fesja

関連する問題