2016-08-09 22 views
0

以下のコードでは、最初の関数が完全に終了する前に、setTimeOut()を実行して2番目の関数を停止しなければなりませんでした(filterMovies()の下部を参照)。その前に、私は最終的な反復のみのコールバック(私の場合は同じコードからsetTimeOut()を差し引いたもの)と両方を使用しようとしていましたが、最初のコードが完全に実行される前に実行されていました。JavaScriptにsetTimeoutより優れたものがありますか?

私はこれが何百という$(".movie")要素を扱っているからです(実際には分かりませんが)。

setTimeOut()でも問題はありませんが、ページ上でのコーディングとパフォーマンス(遅延後にテキストが更新されます)の両方でうまくいかないようです。より良いコーディング練習の精神には、その非常に最後の要素は、最大にスライドか?

function filterMovies() { 
    $(".movie").each(function(i) { 
    var movie = $(this); 

    var genreMatch = 
     !chosenGenres.length 
     ? true 
     : chosenGenres.every(elem => movie.find(".genre").text().indexOf(elem) !== -1); 

    var directorMatch = 
     !chosenDirectors.length 
     ? true 
     : chosenDirectors.every(elem => movie.find(".director").text().indexOf(elem) !== -1); 

    var countryMatch = 
     !chosenCountries.length 
     ? true 
     : chosenCountries.every(elem => movie.find(".countries").text().indexOf(elem) !== -1); 

    i === $(".movie").length -1 
     ? genreMatch && directorMatch && countryMatch 
     ? movie.slideDown(setTimeout(function() {updateSearchInfo()}, 1000)) 
     : movie.slideUp(setTimeout(function() {updateSearchInfo()}, 1000)) 
     : genreMatch && directorMatch && countryMatch 
     ? movie.slideDown() 
     : movie.slideUp(); 
    }); 
} 

function updateSearchInfo() { 
    movieCount = $(".movie:visible").length; 
    $("#search-info").text("Showing " + movieCount + " movies."); 
} 

感謝を滑り落ちたか後にちょっと、updateSearchInfoは、さえまでランニングについて考えていない」というのが、より効率的な方法があります!事前に

+0

jQueryのアニメーションは通常2つのパラメータ、デュレーションおよびコールバックを持っている - 何を渡していることは(はい、setTimeoutをした結果が数である)の数であるので、期間としてあることを利用しています。.. 。試してください 'movie.slideUp(updateSearchInfo)'など –

答えて

3

jQueryのslide*機能は、完了時に実行されるコールバックパラメータを取る:

完全 Type: Function() アニメーションが完了したら、呼び出す関数。一致した要素ごとに1回呼び出される。完了時に

... 
movie.slideDown(updateSearchInfo); 
... 
+1

注:どちらのパラメータも省略することはできますが、再生時間のデフォルト値は400です。スライドアップ/ダウン機能は少なくとも –

+0

パーフェクト、ありがとうございます! – dedaumiersmith

関連する問題