2016-08-09 75 views
0

在下面的代碼中,我必須介紹setTimeOut()以在第一個函數完全結束之前停止第二個函數的運行(請參閱filterMovies()的底部)。在此之前,我試圖使用最終迭代調用回調(在我的情況下,相同的代碼減去setTimeOut()和持續時間),但它仍然會在第一個代碼完全執行之前運行。在JavaScript中有沒有比setTimeout更好的東西?

我認爲這是因爲我正在處理幾百個$(".movie")元素(雖然我不太清楚)。

setTimeOut()工作正常,但它在頁面上的編碼和性能(延遲後的文本更新)方面似乎不雅。在更好的編碼實踐的精神,有沒有說「哎,updateSearchInfo,甚至不考慮運行,直到後非常最後一個元素要麼向上滑動或下滑?

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."); 
} 

感謝的更有效的方法!提前

+0

jQuery的動畫通常有兩個參數,持續時間和回調完成時 - 你所傳遞是一個數字(是的,setTimeout的結果是一個數字),所以它使用的時間.. 。試試'movie.slideUp(updateSearchInfo)'等 –

回答

3

jQuery的slide*功能採取在完成運行的回調參數:

完整 Type: Function() 動畫完成後調用的函數,每匹配元素調用一次。

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

注意:你可以省略其中任何一個參數,在slideUp/down函數中持續時間默認值爲400,至少爲 –

+0

完美,謝謝兩位! – dedaumiersmith

相關問題