2016-10-24 12 views
0

これは、写真ソースが存在するかどうかを確認するサイトのテストです。この写真が存在しない場合、これらの写真が表示される余分なパネルを非表示にします。問題は私が出てくるbreakVar = true;状態を得ることができないとループはどちらも停止しない、私はブレーク/リターンで停止するためにそれを得るためにさまざまな方法を試してみました。なぜforループから抜け出せないのですか?

私はtestPhotos(currentProduct,display,breakVar);の出力をテストしています。私は余分なパネルを隠すことができるので、 "テスト失敗"の戻り値を取得したいと思います。

ええ、私は必死にコード実行中の状態をチェックしようとしたので、醜いコードになりました。

私は別の場所でbreak;文を入れてみましたが、私はテストが私のコンソールでループで8回失敗し得る「不正なbreak文」エラー

取得しました。

var breakVar = false; 

function triggerPhotoFail(breakVar) { 
    breakVar = true; 
    consol.log('triggerPhotoFail ran'); 
    return "test-fail"; 
} 
function testPhotos(currentProduct,display,breakVar) { 
    for (var i = 0; i < 5; i++) { 
    // test if photos exists 
    if (breakVar === true) { 
     break; // get out of loop 
    } 
    var src = productArray[currentProduct]['subphoto-' + i]; 
    $.get(src) 
    .done(function() { 
     // photo exists 
    }) 
    .fail(function(breakVar) { 
     // photo does not exist 
     console.log('test failed in loop'); 
     breakVar = true; 
     triggerPhotoFail(); 
     console.log('breakVar change!: ' + breakVar); 
    }) 
    } 
    if (breakVar === true) { 
    console.log('breaker var tested true'); 
    return "test-fail"; 
    } 
    else { 
    return "not acknowledged"; 
    } 
} 

答えて

2

$.getは非同期です。ループはの前に完了し、doneまたはfail関数が呼び出されました。

forループを、done関数が起動したときに高度なイテレータに置き換える必要があります。

function testPhotos(currentProduct, display) { 
    // This starts the loop 
    var i = 0; next(); 

    function next() { 
    // This replaces the regular "end of for loop" check 
    if (i == 5) { 
     return; 
    } 

    $.get(src) 
     .done(function() { 
     // photo exists 
     i++; next(); // This does the "End of for loop increment" test and starts the next loop 
     }) 
     .fail(function(breakVar) { 
     // photo does not exist 
     console.log('test failed in loop'); 
     triggerPhotoFail(); 
     // We don't call `next()` here, which breaks the loop 
     }); 

    } 
} 
+0

大丈夫、お試しください – joehungjohn

+0

ちょっとそれは、あなたがそれを呼び出す関数の中で関数を入れ子にしていたことを涼しくしていますか?クリーナー? – joehungjohn

+0

'i'がグローバルになるのを止めます。 – Quentin

0

あなたは、その定義に1つのパラメータ、すなわちbreakVarを必要とし、あなたのtriggerPhotoFail()関数に任意の引数を渡すではありません。 自体がすでにグローバルであるため、は、すべてをbreakVarの関数定義から削除して呼び出します(.fail(function()...)。

+0

ええ私は気づいた、私は前にパラメータを持っていないが、私はそれが問題の一部であるかどうかを確認するために追加すると思った。閉鎖の権利?とにかくありがとう – joehungjohn

+0

はい、関数のパラメータとして 'breakVar'を置くと、そのスコープはその関数だけにローカルになるからです。 –

+0

それは本当ですか?たとえ2つの異なる関数の外でbreakVarが宣言されても、各関数にbreakVarを渡しても、各関数がそれにアクセスできるわけではありませんか? 1つの関数がbreakVarを変更した場合、他の関数はその変更を認識しませんでしたか? – joehungjohn

関連する問題