Poddaje się, poświęciłem i tak za dużo czasu. Co mi z tego że zaraz znowu się będę powtarzał, skoro i tak będziesz moje słowa przeinaczał po swojemu. Nie, nie napisałem że promise samo w sobie jest bez sensu. Sprostuje: Uważam że promise jest zajebiste, wielokrotnie korzystałem i będę korzystał podobnie jak z innych dobrodziejstw za pomocą których da się coś zrobić łatwiej, szybciej, dobrze i krócej. Uważam że jak najbardziej do takiej animacji zmiany obrazków, można byoby stworzyć bardzo klarowny kod za pomocą obietnic. Uważam że żaden kod który logicznie jest źle napisany, nie staje się automatycznie klarowny, bo został objęty w klamrę jakiejś funkcji. Zrozum, że konkretnie w tym przypadku, druga obietnica nigdy nie zostanie spełniona przed pierwszą, to jakie niby korzyści czerpiesz z tych obietnic ? Do czego mają służyć ? Jeszcze raz:
// twój kod
Promise.all([
new Promise(resolve => {setTimeout(resolve, 1000);}),
new Promise(resolve => {setTimeout(resolve, 3000);}),
]).then(() => {document.write(' KONIEC! ');});
// mój kod
setTimeout(function(){ document.write(' KONIEC! '); }, 3000);
https://jsfiddle.net/mocw9oh5/7/który kod jest klarowniejszy ? Oba działają identycznie.
Cytat
Jeżeli faktycznie można wyłapać koniec animacji w ładniejszy sposób, no to fajnie. setTimeout odpada.
Przecież podałem Tobie już 2 przykłady w kodzie jak to robić - od dawien dawna animacje przechwytuje się za pomocą zdarzeń. Stosowanie setTimeout na czas animacji to po pierwsze totalna wiocha i amatorszczyzna (serio), po drugie nigdy ale to NIGDY nie powinno się tego robić w taki sposób.
Cytat
Tylko że w jaki sposób sprawdzisz czy obrazek jest gotowy i animacja jest gotowa jednocześnie? Te oba kryteria muszą zajść, żeby wykonać odpowiednią akcję (pokazać obrazek). Moim zdaniem Promise.all to o wiele bardziej eleganckie rozwiązanie tu niż jakieś wzajemne sprawdzanie kryteriów na krzyż, gdzie callback animacji sprawdzi gotowość obrazka, a callback obrazka sprawdzi gotowość animacji i oba będą miały tę samą akcję w kodzie.
No i słusze uważasz że promise w takiej sytuacji będzie bardziej - jak to ujmujesz, eleganckie (prawidłowy przykład przedstawiłem w poprzednim poście). Nie oznacza to jednak że samo zastosowanie promise będzie miało sens, skoro zrobisz to źle, bo robisz to źle myślac własnie w ten sposób:
Cytat
Twierdzę jednak, że nawet gdyby jedna z tych asynchronicznych akcji miała mieć stały czas, to nadal Promise.all jest dobrym, eleganckim rozwiązaniem.
Nie ma w tym konkretnie przykładzie kilku asynchronicznych akcji. Jest tylko jedna - ładowanie obrazka, której ty i tak nie wykonujesz bo zamykasz to w timeoutcie. Druga akcja to animacja, której zakończenie określasz też w timeout'cie, który to trwa zawsze krócej niz wczytywanie obrazka. Co Ci z tego przywileju promise.all, który zrzuca z ciebie całe te jarzmo sprawdzania wzajemnie callbacków, skoro i tak nawet z tego nie korzystasz - bo pierwszą obietnice ZAWSZE spełniasz po sekundzie, a drugą ZAWSZE po 3 sekundach, więc finalnie nie musisz nawet sprawdzać czy pierwsza się wykona, skoro druga ZAWSZE będzie wykonywać się po pierwszej i będzie jednocześnie ostatnią, rozumiesz ? To jest totalnie bez sensu. Cały ten Twój kod mógłbym napisać w ten sposób i działałby identycznie:
//rozpocznij animacje która trwa sekundę
$('#gallery').addClass('fadeOut');
// załaduj obrazek do zmiennej
var img = $("
<img />").attr('src', 'obrazek.jpg')
// po 3 sekundach wstaw obrazek, bez względu na to czy się załadował
setTimeOut(function(){
$('#gallery-img-container').html(img);
}, 3000);
Poświęciłem wystarczająco dużo czasu, wróć do poprzednich postów, przeczytaj je jeszcze raz i przeanalizuj. Podałem Tobie rozwiązania w teorii a nawet w kodzie. Na dalszą dyskusje nie mam już siły a nawet chęci.