2014-06-05 4 views
1

나는 두 가지 제안 된 방법을 함께 묶었지만 올바르게 작동하는 코드를 얻는 방법을 볼 수 없다는 점을 잘 알고 있습니다.약속 및 지연 객체

var animals = ['mouse', 'newt', 'shrew', 'grasshopper', 'frog', 'hedgehog']; 

$('#s1text1').delay(dur).fadeOut(dur).promise() 
.then(function() { 
    return $('#s1text2').fadeIn(dur).promise(); 
}) 
.then(function() { 
    var p = new $.Deferred().resolve(); 
    return $.each(animals, function(i, animal) { 
     p = p.then(function() { 
      return $('.' + animal).fadeIn(defaultDur, function() { 
       animateAnimalGroup(animal); 
      }).promise(); 
     }); 
    }) 
    .then(function() { 
     return $('#s1text2').fadeOut(dur).promise(); 
    }) 
    .then(function() { 
     return $('#s1text3').fadeIn(dur).promise(); 
    }) 
    .then(function() { 
     return $('#s1text4').fadeIn(dur).promise(); 
    }); 

어떤 도움이나 조언을 주시면 감사하겠습니다. 좋은 튜토리얼/기사는 정말로 유용 할 것입니다. 누군가가 하나를 알고 있다면, 나는 약간의 비트를 읽었지만 그 주위에 머리를 쓰려고 고심하고 있습니다.

+0

실제로 문제를 설명하는 것이 매우 도움이됩니다. 작동하지 않는 것은 무엇이며 작동 방법은 무엇입니까? –

+2

'p = p.then'에서'.then'을 어디에서 닫고 있습니까? –

+0

'var p = new $ .Deferred(). resolve();'의 요점은 무엇입니까? 왜 연기 된 것을 만들고 즉시 해결해야합니까? 왜 당신이 나중에 해결할 지연을 생성하지 않는가? 또는 더 나은 방법은 jQuery 애니메이션의 약속을 사용할 수있을 때 직접 만드는 것입니다. – jfriend00

답변

1

$.each의 결과를 반환하고 싶지 않은 경우 루프에 누적 된 p 약속을 반환하고 싶습니다. 또한, 닫는 괄호를 누락 :

.then(function() { 
    var p = new $.Deferred().resolve(); 
    $.each(animals, function(i, animal) { 
     p = p.then(function() { 
      … 
     }); 
    }) 
    return p; 
}) 
.then(…) 
+0

스폿이 켜져 있습니다. 빨리 대답 해 주셔서 감사합니다. ! – bigwigal

0

Bigwigal, 당신은 명시 적 루프 또는 명시 적 할당/생성 약속의 재 할당을위한 필요없이 당신의 .then() 체인을 구축, array.reduce() 관련된 다른 접근 방식에 관심이있을 수 있습니다. 이제이 무엇

//Data 
var animals = ['mouse', 'newt', 'shrew', 'grasshopper', 'frog', 'hedgehog'], 
    fades1 = [ 
     {id:'s1text1', delay:dur, action:'fadeOut'}, 
     {id:'s1text2', delay:0, action:'fadeIn'} 
    ], 
    fades2 = [ 
     {id:'s1text2', delay:0, action:'fadeOut'}, 
     {id:'s1text3', delay:0, action:'fadeIn'}, 
     {id:'s1text4', delay:0, action:'fadeIn'} 
    ]; 

//Phase 1 (initial fades) 
fades1.reduce(function(promise, item) { 
    return promise.then(function() { 
     return $('#' + item.id).delay(item.delay)[item.action](dur).promise(); 
    }); 
}, $.when()).then(function() { 
    //Phase 2 (animal fades) 
    return animals.reduce(function(promise, animal) { 
     return promise.then(function() { 
      return $('.' + animal).fadeIn(defaultDur).promise().then(function() { 
       return animateAnimalGroup(animal);//you probably want a return here but not necessarily, depending on the visual effect you want. 
      }); 
     }); 
    }, $.when()); 
}).then(function() { 
    //Phase 3 (final fades) 
    return fades2.reduce(function(promise, item) { 
     return promise.then(function() { 
      return $('#' + item.id).delay(item.delay)[item.action](dur).promise(); 
     }); 
    }, $.when()); 
}); 

를 데이터 - 구동 된 세부의 부호화 하드 일반화 삼상 애니메이션 패턴이다. 세부 사항을 변경하려면 어레이를 수정하십시오 (animals, fades1fades2).

이 방법은 유용 할 수 있습니다. 최종 결과는 그리 많지 않지만 개발 중에는 만족하기 전에 마음을 수십 번 바꿀 것입니다.

아마도 하나의 배열과 하나의 .reduce()으로 전체 작업을 수행 할 수 있지만 데이터 구조와 코드가 다루기 힘들어 질 수 있습니다.

나는 .reduce() 패턴이 지구상에서 가장 읽을 수있는 것이 아니라는 것에 동의하지만 그것을 배우는 고통의 장벽을 헤쳐 나갈 가치가있다.

+0

시간을내어 설명해 주셔서 감사합니다. 정말 고맙습니다. 이 접근법의 장점을 분명히 볼 수 있습니다. – bigwigal

+1

방금이 투표를 시도했지만 불행히도 대표가 없습니다. 다시 한번 감사합니다. 매우 유용합니다. – bigwigal

+0

Bigwigal, StackOverflow에 의미가 없습니다. 선량은 upvote하기 전에 왜 rep가 필요한지 알고 있습니다. 나중에 몇 가지 포인트를 얻었다면 언제든지 다시 올 수 있습니다. –